栈是一种后进先出的数据结构,它是一种特殊的线性表,对于其中的元素来说,最先进去的元素位于栈底,最后进入的元素位于栈顶。我们只能在栈顶操作元素,比如从栈顶插入元素,从栈顶删除元素。
栈这种结构可以用生活中的一些例子来讲解。比如我们从羽毛球筒里拿羽毛球,只能从顶部来取羽毛球,如果想拿最底部的羽毛球,必须要先把上面的羽毛球一个一个拿出来才行。还有一个更形象的例子就是手枪的弹夹。枪手把子弹一个个地装入弹夹中,在开枪的时候,总是会先把弹夹顶部的子弹弹出去。弹夹就相当于一个栈,里面的子弹是栈的元素,弹出子弹的过程就是从栈中删除元素的过程。
栈是属于线性表,按照存储结构的不同,它有顺序结构和链式结构。下面我们先来讲解下栈的顺序存储结构。
我们先来定义一下顺序栈的数据结构:
typedefstructSqStack{
intdata[MAX_SIZE];//用于存储栈元素,MAX_SIZE为自定义数组大小
inttop;//指向栈顶的位置,栈为空的时候,top为-1
}
当我们要往栈中插入元素时,可以定义下面的函数:
Statuspush(SqStack*s,inte){
if(s-top==Max_size-1){
returnERROR;
}
s-top++;
s-data[s-top]=e;
returnOK;
}
当我们要从栈中删除元素时,可以编写如下函数:
Statuspop(SqStack*s,int*e){
if(s-top==-1){
returnERROR;
}
*e=s-data[s-top];
s-top--;
returnOK;
}
当我们依次将元素7、3、9、2这四个元素存入顺序栈中的时候,栈内部存储元素的顺序是这样的:
top指向2所在的位置,在此处top的值就是4,它也可以表示栈的长度。
对于这四个元素,在它们已经全部入栈的情况下,栈中元素出栈的顺序只能是2、9、3、7,如果是元素入栈的时候又有元素出栈的,则元素出栈的顺序就会有多种情况,比如:
(1)元素7入栈,7出栈,元素3入栈,3出栈,元素9入栈,9出栈,元素2入栈,2出栈;这种情况元素的出栈顺序就是7、3、9、2
(2)元素7入栈,元素3入栈,元素3出栈,元素9入栈,元素2入栈,元素2出栈,元素9出栈,元素7出栈;此种情况下,栈中元素出栈的顺序就是3、2、9、7
通过上面讲解,大家要能明白,当涉及元素出栈顺序时,我们要理清题意,看有没有一些条件限制,切勿以为出栈顺序必须和入栈顺序相同。