一、栈的定义
栈是一种只能在一端(栈顶)进行操作的数据结构,具有后进先出的特点。
二、栈的顺序储存结构
1、基本结构
typedef struct SqStack
{
SElemType data[MAXSIZE];
int top;//栈顶下标,相当于栈顶指针,始终指向栈顶元素
}SqStack;
2、基本操作
进栈操作
int Push(SqStack *S,SElemType e)
{
if(S->top==MAXSIZE-1)//栈满
return 0;
S->top++;//栈顶指针加一
S->data[S->top]=e;//将新元素赋值给栈顶
return 1;
}
出栈操作
int Pop(SqStack *S,SElemType *e)
{
if(S->top==-1)//栈空
return 0;
*e=S->data[S->top];//将栈顶元素赋值给e
S->top--;//栈顶指针减一
return 1;
}
3、两栈共享空间
利用栈的数组结构时,虽然插入删除方便,但是我们却要先确定好数组储存空间,不够用了又得扩充容量,很麻烦,如果我们有两个相同类型的栈,我们可以将两个栈合并一起,形成共享空间,可以提高栈的利用率。
基本结构
typedef struct
{
SElemType data[MAXSIZE];
int top1;//栈1栈顶指针
int top2;//栈2栈顶指针
}SqDoubleStack;
特点:(1)一个栈(记为栈1)的栈底作为首段,下标为0,另一个栈(记为栈2)的栈底作为尾端。
(2)当top1=-1时栈1为空,top2=n-1时栈二为空,top1+1=top2时,栈满。
基本操作
(1)push
int push(SqDoubleStack *S,SElemType e,int stackNumber)
{
if(S->top1+1==S->top2)//判断是否栈满
return 0;
if(stackNumber==1)//栈1进栈
S->data[++S->top1]=e;
else if(stackNumber==2)//栈2进栈
S->data[--S->top2]=e;
return 1;
}
(2)pop
int Pop(SqDoubleStack *S,SElemType *e,int stackNumber)
{
if(stackNumber==1)
{
if(S->top1==-1)
return 0;
else
*e=S->data[S->top1--];
}
if(stackNumber==2)
{
if(S->top2==MAXSIZE-1)
return 0;
else
*e=S->data[S->top2++];
}
return 1;
}