基本概念
栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线性表。
栈是一种数据结构,是只能在某一端插入和删除的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。 栈也称为后进先出表(LIFO表)。
栈可以用来在函数调用的时候存储断点,做递归时要用到栈!
来几道例题:
1.如果输入序列为1 2 3 4 5 6,试问能否通过栈结构得到以下两个序列:4 3 5 6 1 2和1 3 5 4 2 6;请说明为什么不能或如何才能得到?
输入序列为123456,不能得出435612,其理由是,输出序列最后两元素是12,前面4个元素(4356)得到后,栈中元素剩12,且2在栈顶,不可能栈底元素1在栈顶元素2之前出栈。
得到135426的过程如下:1入栈并出栈,得到部分输出序列1;然后2和3入栈,3出栈,部分输出序列变为:13;接着4和5入栈,5,4和2依次出栈,部分输出序列变为13542;最后6入栈并退栈,得最终结果135426。
2.上面例题不可能得到的出栈序列数目个数为:6!-C(6,12)/7,其中可能得到序列是C(n,2n)/n+1;
3.若一个栈以向量V[1..n]存储,初始栈顶指针top为n+1,则下面x进栈的正确操作是:
A.top:=top+1; V [top]:=x B. V [top]:=x; top:=top+1
C. top:=top-1; V [top]:=x D. V [top]:=x; top:=top-1
这里与严蔚敏老师的C语言版教材定义的栈不一样,top=n+1的时候栈为空,所以top=n时是指向栈顶,从高位开始;所以先指向栈顶,再把X存入栈顶,从上到下依次进栈。这里初始化栈的时候top=n+1表示占了一位,但是不赋值,平常我们自己初始化栈是把top和base指针赋空,如压入一个元素则将top和base同时指向栈底,以后每压入一个元素则将top指向新增的这个元素,而严蔚敏老师的C语言版教材则是定义top和base同时指向栈底时代表空栈,top指向新增加元素的后一位。
4.若栈采用顺序存储方式存储,现两栈共享空间V[1..m],top[i]代表第i个栈( i =1,2)栈顶,栈1的底在v[1],栈2的底在V[m],则栈满的条件是( )。
A. |top[2]-top[1]|=0 B. top[1]+1=top[2]
C. top[1]+top[2]=m D. top[1]=top[2]
出栈顺序解法
原题:
有四个元素a, b, c, d依次进栈,任何时候都可以出栈,请写出所有可能的出栈序列。
该题有两种思路:
1.直接找出所有正确的解;
2.在全集中排除不正确的解,剩余的即为正确解。我将要给出的是第二种思路——间接法求解的过程。
间接法的优点:可以对随机输入的一组序列进行判断,看是否是正确的出栈序列。
间接法的缺点:如果要求解全部正确的出栈序列,需先求出全排列,然后用该判断函数对全排列中的每一组序列进行检验,将正确的序列输出。
简介:
由于题目已经隐性规定“a在b先入栈,b在c先入栈,c在d先入栈,……”如果原始序列用s表示,那么题目隐含条件可归纳为“s[ i ]在s[ i + 1]先入栈”。因此,在出栈的时候,若若j < m < n < k,且s[ j ]和s[ k ]均已出栈,则s[ m ]必不可能在s[ n ]之前出栈。
例:
s = a, b, c, d
若出栈序列的前两个元素是:c, d,则说明a, b还在栈中(a要退栈的前提是b先退栈),此时可以确定正确的出栈序列是:c, d, b, a。
检测函数:
出栈顺序解法From: http://blogger.org.cn/blog/more.asp?name=binaryluo&id=17452