赞
踩
栈是一种操作受限的线性表,而采用顺序存储的栈是顺序栈,它是利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时携带一个指示当前栈顶元素位置的指针(top),顺序栈与线性表的知识框架如图所示:
注:栈和队列的判空,判满条件,会因实际给的条件不同而变化,上面提到的方法以及下面的代码实现只是在栈顶指针设定的条件下的相应方法,而其他情况则需具体问题具体分析。
由于顺序栈的入栈操作受数组上界的约束,当对栈的最大使用空间估计不足时,有可能发生栈上溢,此时应及时向用户报告消息,以便及时处理,避免出错。
- /***顺序栈的实现***/
- #include <iostream>
- using namespace std;
- /*
- 这是C语言标准的包含库头文件stdlib.h的语句。
- C++兼容C语言的语法。
- */
- //#include<stdlib.h>
-
- /*
- 在C++中#include <conio.h>简单说就是“通用输入输出库”,
- 主要是文件和标准控制台的输入输出。
- conio是Console Input/Output(控制台输入输出)的简写,
- 其中定义了通过控制台进行数据输入和数据输出的函数,
- 主要是一些用户通过按键盘产生的对应操作,比如getch()函数等等。
- conio.h则是一个库文件,当程序中使用了getch()之类的函数,
- 就需要在代码中引入这个库文件。conio.h是基本输入输出文件,
- 里面有一个很常用的清屏函数clrsr()可以清屏,
- 与stdio.h?Standard?Input?or?Iutput?好用多了。
- */
- #include <conio.h>
-
- //顺序栈定义
- #define OK 1
- #define ERROR 0
- #define OVERFLOW -2
- #define MAXSIZE 100
- typedef int Status;
- typedef int SElemType;
-
- typedef struct{
- SElemType *base;//栈底
- SElemType *top; //栈顶
- int stacksize;
- }SqStack;
-
- //算法3.1 顺序栈的初始化
- Status InitStack(SqStack &S){//构造一个空栈 S
- S.base = new SElemType[MAXSIZE]; //为顺序栈分配一个最大容量为MAXSIZE的数组空间
- if(!S.base)
- exit (OVERFLOW); //存储分配失败
- S.top = S.base;
- S.stacksize = MAXSIZE;
- return OK;
- }
-
- //算法3.2 顺序栈的入栈
- Status Push(SqStack &S,SElemType &e)
- {
- // 插入元素e为新的栈顶元素
- if(S.top-S.base==S.stacksize)
- return ERROR;
- //栈满
- *(S.top++) = e;
- //元素e压入栈顶,栈顶指针加1
- return OK;
- }
-
- //算法3.3 顺序栈的出栈
- Status Pop(SqStack &S,SElemType &e)
- {// 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
- if(S.base == S.top)
- return ERROR;//栈空
- e = *(--S.top); //栈顶指针减1,将栈顶元素赋给e
- return OK;
- }
-
- //算法3.4 取顺序栈的栈顶元素
- Status GetTop(SqStack S,SElemType &e)
- { //若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
- if(S.top == S.base)
- return ERROR;
- e = *(S.top-1); //栈顶指针减1,将栈顶元素赋给e
- return OK;
- }
-
- int main()
- {
- SqStack s;
- SElemType e;
- SElemType t;
- cout<<"进栈元素依次为:"<<endl;
- if(InitStack(s)==OK)
- for(int j=1;j<=12;j++)
- {
- Push(s,j);
- cout<<j<<" ";
- }
- cout<<endl<<"依次弹出的栈顶元素为:"<<endl;
- while(GetTop(s,e) == OK)
- {
- cout<<e<<" ";
- Pop(s,t);
- }
- cout<<endl;
- return 0;
- getch();
- }
如结果所示,栈中数据的进栈和出栈顺序为,先进栈的数据后出栈。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。