數據結構復習【第三章】 棧
阿新 • • 發佈:2018-09-22
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、去除括號
求值過程中棧的變化:
數據結構復習【第三章】 棧