1.1顺序栈
本质是顺序表的简化,入栈时先判断栈是否已满,若满则称“上溢”,出栈时需判断是否为空,栈空则为“下溢”,入栈操作S->Top+1,出栈操作S->Top-1
1.1.1顺序栈的类型
#define maxsize 1024
typedef int datatype;
typedef struct
{
datatype data[maxsize];
int Top;//表示栈顶位置
}SeqStack;
1.1.2顺序栈的基本操作
1.栈初始化
void InitStack(SeqStack*&S)
{
S=(SeqStack*)malloc(sizeof(SeqStack));
S->Top=-1;//栈顶指针置为-1,即为置空栈
}
2.置空栈
void SetNull(SeqStack*S)
{
S->Top=-1;
}
3.判断空栈
int Empty(SeqStack)
{
if(S->Top==-1)
{
return 1;
}
else return 0;
}
4.入栈
int Push(SeqStack*S,datatype x)
{
if(S->Top==maxsize-1)
{
printf("栈上溢");
return 0;
}
else
{
S->data[++S->Top]=x;//先移动指针,即栈的高度加一
return 1;
}
}
5.出栈
这里和第六部分的形参都是“地址x"因为可以直接改变参数的值(虽然好像没啥用…疑惑)
int pop(Seqstack*S, datatype &x)
{
if(S->Top=-1)
{
printf("栈下溢");
return 0;
}
else
{
x=S->data[S->Top--];//先出栈再移动栈顶指针位置
return 1;
}
}
6.取栈顶元素
int GetTop(SeqStack*S, datatype&x)
{
if(S->Top==-1)
{
printf("栈下溢");
return 0;
}
else
{
x=S->data[S->Top];
return 1;
}
}
1.1.3多个顺序栈共享连续空间
为了避免某个栈上溢,可以让这些栈共享一个连续空间,代码如下:
typedef struct
{
datatype v[maxsize];
int Top1,Top2;
}SeqStack;
SeqStack*S=(SeqStack*)malloc(sizeof(SeqStack));
将两个栈的栈底固定在一维连续空间的两端,从栈顶向中间延伸.
将元素插入i号栈代码如下:
void push(SeqStack*S,datatype x,int i)
{
if(S->Top+1==S->Top2)
{
printf("数组空间已满,发生上溢");
}
else if(i==1)
{
S->Top1++;
S->v[S->Top1]=x;//入一号栈
}
else
{
S->Top2--;//这里需要留意,Top2是从一维连续空间逆向排列的所以需要减一
S->v[S->Top2]=x;//入二号栈
}
}
出栈算法如下:
datatype pop(SeqStack*S, int i)
{
datatype x;
if(i==1)
{
if(S->Top1==-1)
{
printf("xiayi");
}
else
{
x=S->v[S->Top1];
S->Top1--;//1号栈出栈
}
else if(S->Top2==-1)
{
prnintf("xiayi");
}
else
{
x=S->v[S->Top2];
S->Top2++;//2号栈出栈
}
return x;
}
}
当Top1=-1时,一号栈为空,当Top2=maxsize时,二号栈为空。2号栈出栈应该加1,1号栈出栈应该减1。