数据结构 栈以及出栈算法

基本概念


   栈(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]存储,初始栈顶指针topn+1,则下面x进栈的正确操作是:

   

       Atop:=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          

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章