一,顺序栈
1.顺序栈的存储结构
2.顺序栈的初始化
3.顺序栈的入栈
4.顺序栈的出栈
5.取顺序栈的栈顶元素
首先栈是一个先进后出的结构
栈分两种存储方式,顺序表示和链式表示,队列也是,以后会讲
1.顺序栈的存储结构
#define maxsize 100
typedef struct sqstack
{
int *top;
int *base;
int stacksize;
}sqstack;
要记住代码,首先理解代码
首先一个栈最重要的是什么,由代码得:
两个指针,一个 栈的容量
but为什么是两个指针,一个不行吗
还真不行,C语言数组下标从0开始,0就表示有一个了,又不能用负数,那让空栈情何以堪。
图纸有了,接下来就是如何建房子,即1.顺序栈的初始化(构造一个空栈)
#define overflow -2
int initstack(sqstack &s)
{
s.base =new int[stacksize];
if(!s.base)exit(overflow);
s.top=s.base;
s.stacksize=maxsize;
}
2.顺序栈的入栈
int push(sqstack &s,int &e)
{
if(s.top-s.base==stacksize)return error; //栈已满,你放不了了
*s.top++=e;
}
3.顺序表的出栈
int pop(sqstack &s,int &e)
{//删除s的栈顶元素,用e返回其值
if(s.top==s.base)return error; //空栈,你还想取啥呢
e=*--s.top; //既通过修改栈顶指针的值来删除栈顶元素,又让e返回栈顶元素,可谓一举两得
}
顺便一提,栈顶指针一直在栈顶元素的上一位,如最开始base和top都指向a[0],现加入一个元素,top加1,指向a[1],所以栈顶指针在栈顶元素的上一位。因此,返回栈顶元素时,应写成e=*- -s.top; 而不能写成 e=*s.top- -;
4.取栈顶元素
int gettop(sqstack &s)
{
if(s.top!=s.base) //判断栈是否为空
return *(s.top-1);
}
该函数可返回栈顶的元素,而不修改栈顶指针。