1. 程式人生 > >數據結構復習【第三章】 棧

數據結構復習【第三章】 棧

del 一次 3.2 alt 技術分享 求值 == 字符 image

1)掌握棧的相關概念、特點和基本操作(入棧、出棧、判棧空、獲取棧元素等)。

棧:限制只能在表的一端進行插入和刪除的線性表。

允許插入和刪除的一端,稱為棧頂(top)。

不允許插入和刪除的另一端,稱為棧底(bottom)。

把一個元素從棧頂放入棧中的操作,稱為進棧、入棧或壓棧 (push)

從棧頂取出一個元素的操作稱為出棧或彈出(pop)。

特點:後進先出

2)掌握順序棧、鏈棧、共享棧的實現。

順序棧:

基本操作:

  創建:

{
     base = new T[m];
     if (base = = NULL)    {        
        exit(1);
    }
     stacksize 
= m; top=-1; }

  入棧:

{
   if (top = = stacksize-1)
       throw "棧滿,無法入棧";
   top++;                                        
   base[top]=x;
}

  出棧:

{
   if ( top = = -1)
      throw “棧空,不能出棧”; 
   x = base[top--];
   return x;
}

  判斷棧空:top==-1

  獲取棧頂元素:

{
    if ( top = = -1 )
       throw "棧空,棧頂無元素";
     return base[top];
}

鏈棧:

  結點定義:

struct Node
{
    T data;
    Node<T> *next;//此處T可以省略
};

  入棧:

{  
     s=new Node<T>;
     s->data=x; 
     s->next=top;
      top=s;
}

  出棧:

{    
    if (top = = NULL)
        throw"下溢";     
    p = top;
    x = top->data;                                  
    top 
= top->next; delete p; return x; }

兩者比較:技術分享圖片

3)掌握棧的典型應用:

遞歸;

② 表達式的表示及其求值。

中綴表達式求值:

Step 1:表達式結束符進操作符棧 
Step 2:讀入表達式操作數或操作符
Step 3:如果讀到的字符不是表達式結束符或者操
               作符棧的棧頂元素不是結束符,則進行下
               列操作:
       3.1  如果是操作數,入操作數棧,讀入下一個
            字符
       3.2  如果是操作符,把操作符棧的棧頂元素 (θ1)
              與它(θ2)比較
           3.2.1 如果比較結果是:θ1<θ2,則該操作
                    符進棧,讀入下一個字符
           3.2.2 如果比較結果是:θ1 =θ2 ,操作符
                    退棧,消去一個括號,讀入下一個字符
           3.2.3 如果比較結果是:θ1>θ2,從操作符棧
                    退出一個運算符,從操作數棧退出二個
                     操作數,進行運算,並將運算結果入操
                     作數棧
Step 4:操作數棧頂元素即為表達式計算結果 

例:1 + 2 * ( 7 – 4 ) / 3

操作數棧變化:技術分享圖片

改為後綴表達式:(遇到運算符,出棧兩個數字運算,並把結果放到棧中)

1、寫出中綴表達式
2、按運算先後把每一次運算用括號括起
3、把運算符移至對應的括號的後面
4、去除括號

技術分享圖片

求值過程中棧的變化:

技術分享圖片

數據結構復習【第三章】 棧