1.定义
栈就是一种只能在一端进行插入或者删除的线性表。分为栈顶与栈底,其中栈顶允许插入、删除操作。因为这种特性,栈顶的当前位置是动态的,栈顶当前位置有一个被称为栈顶指针的位置指示器标识。
栈的主要特点是“后进先出”,每次进栈的元素都放在原来栈顶元素之前成为新的栈顶元素,每次出栈的元素也是当前栈顶元素,因此栈也被称为后进先出表。
2.顺序栈存储结构及其基本运算实现
在了解基本运算前,先来了解有关顺序栈的四个要素。下面列出栈的四种状态图。
由这几种状况图可以得出下面结论:
1.栈空的条件:s -> top = = -1。
2.栈满的条件:s -> top = = MaxSize - 1(数组的最大下标)。
3.元素e的进栈操作:先将栈顶指针top增加1,然后将元素e放在栈顶指针处。
4.出栈的操作:先将栈顶指针top处的元素取出放在e中,然后将栈顶指针减去1。
1.初始化,销毁栈以及对栈进行判空
初始化:分配一个顺序栈空间,并将栈顶指针置为-1,销毁:释放顺序栈s占用的存储空间。判空:判断条件s -> top = = -1是否成立。
//初始化
void InitStack(SqStack * & s)
{
s=(SqStack *)malloc(sizeof(SqStack)); //分配一个顺序栈空间,首地址放在s中
s->top=-1;//栈顶元素置为-1
}
//销毁
void DestorySqStack(SqStack * & s)
{
free(s);
}
//判空
bool StackEmpty(SqStack * s)
{
return(s->top==-1);
}
2.进栈、出栈、取栈顶元素
进栈:栈不满时先将栈顶指针加1,然后在该位置上插入元素e,并返回真;否则返回假。
出栈:在栈不为空的情况下先将栈顶元素赋值给e,然后将栈顶指针减1,并返回真;否则返回假
//进栈
bool Push(SqStack * &s,ElemType e)
{
if(s->top==MaxSize-1) //栈满
return false;
s->top++; //栈顶指针加1
s->data[s->top]=e; //元素e放在栈顶指针处
return true;
}
//出栈
bool Pop(SqStack *& s,ElemType & e)
{
if(s->top==-1)
return false;
e=s->data[s->top]; //取栈顶元素
s->top--;
return true;
}
//取栈顶元素
bool GetTop(SqStack *& s,ElemType & e)
{
if(s->top==-1)
return false;
e=s->data[s->top]; //取栈顶元素
return true;
}
测试函数:
int main()
{
ElemType e;
SqStack *s;
printf("(1)初始化栈\n");
InitStack(s);
printf("(2)依次进栈1,5,3,7,8");
Push(s,1);
Push(s,5);
Push(s,3);
Push(s,7);
Push(s,8);
printf("\n");
printf("(3)栈为%s\n",(StackEmpty(s)?"空":"非空"));
printf("(4)出栈序列:");
while (!StackEmpty(s))
{
Pop(s,e);
printf("%d ",e);
}
DestorySqStack(s);
return 1;
}
运行结果:
3.简单应用
判断字符串是否对称:我们分别给定两个数组,{1,3,4,6,5}(不对称);{1,1,2,1,1}(对称),要求判断它们是否是对称的。这里我们就可以利用栈来进行判断。当n个元素连续进栈,产生的进栈序列与连续出栈序列正好相反我们就认为其对称。
bool symmetry(ElemType str[])
{
int i;ElemType e;
SqStack *st;
InitStack(st);
for(i=0;str[i]!='\0';i++)//将所有元素进栈
Push(st,str[i]);
for(i=0;str[i]!='\0';i++) //处理str所有元素
{
Pop(st,e); //退栈元素e
if(str[i]!=e) //若e与当前串字符不同就不对称
{
DestorySqStack(st);
return false;
}
}
DestorySqStack(st);
return true;
}
3.共享栈
顺序栈采用一个数组存放栈中的元素,如果需要用到两个类型的相同的栈,这时如果开辟两个栈,就有可能出现一个栈未满另一个栈都快溢出了。为此我们就可以采用共享栈这一方法,
共享栈有以下要素
1.栈空条件:栈1空条件:top1== -1;栈2空条件:top1==MaxSize。
2.栈满条件:top1==top2-1。
3.元素s进栈操作:进栈1操作为top1++;data[top1]=x;进栈2操作:top2--;data[top2]=x。
4.出栈的操作:出栈1操作为x=data[top1];top1--; 出栈2操作:x=data[top2];top2++;