顺序栈
顺序栈
顺序栈是利用一组地址连续的存储单元依次存放数据元素从栈底到栈顶,栈底位置固定不变,栈顶位置随着入栈和出栈操作而变化,类似于一维数组,那既然是数组,我们就既可以用下标,也可以用指针来操作它
*对顺序栈,我们要实现的操作有:
1 .顺序栈的初始化 Initstack,
2 .顺序栈的入栈(压栈) Push,
3 .顺序栈的出栈(弹栈) Pop,
4 .取栈顶元素GetTop *
1. 数值下标
#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef int Status;
typedef int SElemtype;
既然要用数组下标,那我们就直接在栈中声明一个数组
typedef struct {
SElemtype elem[MAXSIZE]; //存放栈元素的数组
SElemtype top; //存放栈顶元素的下标
int stacksize; //栈的长度
}SqStack;
1.栈的初始化:
Status Initstack(SqStack &s){
s.top = -1; //栈的初始化,如果栈顶指针 top 等于-1 则栈为空栈
s.stacksize = MAXSIZE; //stacksize置为栈的最大容量MAXSIZE
return OK;
}
栈中,当top等于-1时,则该栈就是空栈,所以初始化栈时,我们直接把top=-1即可
2.栈的压栈
Status Push(SqStack &s , SElemtype e){
if(s.top == s.stacksize - 1)
return ERROR; //栈满
s.elem[s.top++] = e; //将元素e压入栈,top下移
return OK;
}
压栈时,首先验证栈是否满了,如果栈满则无法压栈。
当下标top等于stacksize-1时则栈满,
3.弹栈
Status Pop(SqStack &s, SElemtype &e){
if(s.top == -1)
return ERROR; //栈空
e = s.elem[--s.top]; //top指针下移,将值赋给e
return OK;
}
弹栈时需注意的是,如果栈为空,那么你弹栈就会发生错误,所以需先判断栈是否为空
4.获取栈顶元素
SElemtype GetTop(SqStack &s){
if(s.top != -1) //非空
return s.elem[s.top - 1]; //获取栈顶元素
}
获取栈顶元素同样需要判断栈是否为空,如果栈为空,那么你获取的栈顶元素就不是你需要的,也是无意义的
数组下标介绍完了,那就在看下指针操作吧,读者在看的时候,只需理解其一就行,因为两种方法的思路是一样的,只是代码不同
用指针
同样,头文件,宏定义,取别名与上面的一样,那就直接看实现函数吧
typedef struct {
SElemtype *base; //栈底指针
SElemtype *top; //栈顶指针
int stacksize; //栈的长度
}SqStack;
1.初始化
Status Initstack(SqStack &s){
s.base = new SElemtype[MAXSIZE]; //为顺序栈动态分配最大容量为MAXSIZE的数组空间
if(!s.base)
exit(OVERFLOW); //存储空间分配失败
s.top = s.base; //top初始化为base,此时为空栈
s.stacksize = MAXSIZE; //stacksize置为栈的最大容量MAXSIZE
return OK;
}
这里是用指针base开辟空间,作用与数组是一样的
2.压栈
Status Push(SqStack &s , SElemtype e){
if(s.top - s.base == s.stacksize)
return ERROR; //栈满
*(s.top++) = e; //将原素e压入栈底,top上移
return OK;
}
这里判断栈满的用法是,两个指针的差值是否等于s.stacksize,
*(s.top++) = e;其实就是
*(s.top) = e;
s.top = s.top++;
3.弹栈
Status Pop(SqStack &s, SElemtype &e){
if(s.base == s.top)
return ERROR; //栈空
e = *(--s.top); //top指针下移,将值赋给e
return OK;
}
这里判断栈是否为空看着有些奇怪,如果不明白就看初始化函数中 s.top = s.base; 这句,相信聪明的你已经明白了
4.去栈顶元素
SElemtype GetTop(SqStack &s){
if(s.top != s.base) //栈非空
return *(s.top - 1); //返回栈顶元素,不修改top指针
}
这个注释就很明白了
下面看一些测试结果当然这里是用int型数据测试的,读者也可以把
typedef int SElemtype;
中的int修改为其他类型测试一下