顺序栈
栈
1. 定义
栈:只能在表的一端(栈顶)进行插入和删除运算的线性表。
2. 逻辑结构
与线性表相同,仍为一对一关系。
3. 存储结构
用顺序栈或链栈存储均可,但以顺序栈更常见。
4. 运算规则
只能在栈顶运算,且访问结点时依照后进先出(LIFO)或先进后出(FILO)的原则。
5. 实现方式
关键是编写入栈和出栈函数,具体实现依顺序栈或链栈的不同而不同。基本操作有入栈、出栈、读栈顶元素值、建栈、判断栈满、栈空等。
C语言代码实现
1. 顺序栈的表示
2. 结构体
结构体定义代码
如下:
typedef int Status;
typedef int SElemType;
typedef struct {
SElemType *top; //栈顶指针
SElemType *base; //栈底指针
int stacksize; //栈可用的最大容量
}SqStack;
3.初始化
构造一个空栈
(1)分配空间并检查空间是否分配失败,若失败则返回错误
(2)设置栈底和栈顶指针
(3)设置栈大小
初始化代码
如下:
//顺序栈的初始化
Status Initstack(SqStack &S)
{
//构造一个空栈S
S.base=(SElemType*)malloc(MAXSIZE*sizeof(SElemType));//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
if (!S.base)
exit(OVERFLOW); //存储分配失败
S.top=S.base; //top初始为base,空栈
S.stacksize=MAXSIZE; //stacksize置为栈的最大容量MAXSIZE
return 1;
}
4.入栈
(1)判断是否栈满,若满则出错
(2)元素x压入栈顶
(3)栈顶指针加1
入栈代码
如下:
//顺序栈的入栈
Status Push(SqStack &S,SElemType x){
// 插入元素e为新的栈顶元素
if(S.top-S.base>=S.stacksize)
return 1;//栈满
*S.top=x;//元素x压入栈顶
S.top++;//栈顶指针加1
//*(S.top++) = x;
return 0;
}
5.出栈
(1)判断是否栈空,若空则出错
(2)获取栈顶元素x
(3)栈顶指针减1
出栈代码
如下:
//顺序栈的出栈
Status Pop(SqStack &S,SElemType &x){
//删除S的栈顶元素,用e返回其值
if(S.top==S.base)
return 1;//栈空
S.top--;//栈顶指针减1
x=*S.top;//将栈顶元素赋给x
return 1;
}
6. 取栈顶元素
(1)判断是否空栈,若空则返回错误
(2)否则通过栈顶指针获取栈顶元素
去栈顶元素代码
如下