SlideShare a Scribd company logo
資料結構與演算法  課程教學投影片
第七章–堆疊 本章各段大綱 7-1  堆疊概觀 7-2  堆疊的資料結構 7-3  運算式的應用 7-4  後序表示法求值
7-1  堆疊概觀 - 定義 「堆疊」( stack ) 抽象的邏輯結構 是將物件疊放在一起,且一個一個往上堆放 要拿取物件時,則只能從最上層取出,不能從中間取出物件  堆疊的定義 : 堆疊是一個有序串列( ordered list ),而且只能在一個特定的出入口進行資料的增加或刪除。
7-1  堆疊概觀 - 特性與應用 堆疊的特性 先進後出 ( First in last out , FILO ) 後進先出 ( Last in first out , LIFO ) 加入元素到堆疊中稱為推入( push ) 自堆疊中取出元素稱為彈出( pop ) 堆疊的應用 cpu 動作 運算式的處理 副程式的呼叫
7-1  堆疊概觀 - 範例
7-2  堆疊的資料結構 define maxtop 100; char stack[maxtop+1];  或  int stack[maxtop+1]; int top=-1;
7-2  堆疊的資料結構 判斷堆疊是否已滿      if (top==maxtop)      … /*stack 已滿 */      else      … /*stack 未滿 */      end if 判斷堆疊是否為空      if (top==-1)      … /*stack 為空 */      else      … /*stack 不為空 */      end if
7-2  堆疊的資料結構 將資料放入堆疊 Push   stack[++top]=data; // 先執行 top=top+1, 再執行 stack[top]=data 將資料從堆疊取出 Pop   return stack[top--]; // 先傳回 stack[top], 再執行 top=top-1 //  請注意 此式不等同於 return stack[top]; top--;
7-3  運算式的應用 電腦處理算術運算式一次作一個運算 , 複雜的運算式必須轉換為多個獨立的單一運算式 才能運算,由編譯器負責,運用 堆疊結構 進行轉換 中序表示法 當把運算式寫成  ((1+2)*3)-4/2)+5 ,運算子( + 、 - 、 * 、 / )的左右兩邊是運算元時,此種式子稱為中序表示法 後序表示法 後序表示法是將中序表示法中的運算子和運算元素重新調整順序,使得 運算子放於運算元後面 的表示法  前序表示法 前序表示法和後序表示法相類似,只是 運算子的順序是在運算元前面
7-3  運算式的應用 - 運算子優先次序 優先順序 運算子 1 括號() 2 負號  - 3 * 、 / 、 % 4 + 、 - 5 < 、 <= 、 >= 、 > 6 == 、 != 7 && 8 ||
7-3  運算式的應用 由中序表示法轉換成後序表示法的方法有兩種: 加括號去除法 :這種方法是人類使用的方法,主要是應付於考試,想快速得到後序表示法時使用。 堆疊處理法 : 由左而右 掃描資料,依據資料是運算元或運算子作不同的處理,運算子還要考慮其優先次序。
7-3  運算式的應用 -   中序轉後序之 加括號去除法 在所有的運算子左右的運算元外加上括號 再由內而外將括號去除,去除括號時依序排列它的兩個運算子,且運算子搬到這兩個運算元之後,依此類推至所有括號都去除
7-3  運算式的應用 -   中序轉後序之 堆疊處理法 由中序表示法轉換後序表示法的演算步驟  ( 僅需使用堆疊改變運算子的順序 ) 由左而右 依序取得資料 d i 如果 d i 是運算元 ,  直接輸出 如果 d i 是運算子 ( 包含左右括號 ),  則 : 如果 d i = “ ( ”,  放入堆疊 如果 d i = “ ) ” ,  依序輸出堆疊中的運算子 ,  直到取出 “  ( ” 為止 如果 d i 不是 “  ( ” 或 “  ) ”,  則與堆疊頂點的運算子 d s 作優先順序比較 d i 較 d s 優先時 , d i 放入堆疊 d i 不較 d s 優先或相等時 , d s 輸出 , d i 放入堆疊 如果運算式已經讀取完成 ,  而堆疊中尚有運算子時 ,  依序由頂端輸出 d s 置入堆疊中 ,  必為運算子 d i 較 d s 優先  d s d i 運算元 -- 數字等 d s d i 運算子 -- “(”   d s d i 運算子 -- “)”  d s ( d s d i 不較 d s 優先或相等 d s
7-3  運算式的應用 -   中序轉後序之 堆疊處理法
7-3  運算式的應用 中序表示法轉換前序表示法有兩種方法: 加括號去除法 堆疊處理法
7-3  運算式的應用 -   中序轉前序、加括號去除法 加上括號會因為優先順序不同而造成不同結果
7-3  運算式的應用 -   中序轉前序、堆疊處理法 1. 由右而左 依序取得資料 d i 。 2. 如果 d i 是運算元,直接輸出。 3. 如果 d i 是運算子(含左右括號),則 如果 d i =&quot;)&quot; ,放入堆疊 如果 d i =&quot;(&quot; ,依次輸出堆疊中的運算子,直到取出 &quot;)&quot; 為止 如果 d i 不是“ )” 或“ (” ,則與堆疊頂點的運算子 d s 作優先順序比較 d i 較 d s 優先時,  d i 放入堆疊,迴圈輸出堆疊資料,直到優先次序相等 d i 不較 d s 優先或相等時, d s 輸出, d i 放入堆疊 4. 如果運算式已讀取完成,而堆疊中尚有運算子時,依序由頂端輸出 。 範例三  若以括號表示法  1+2*(3-4)/2    (1+ ( 2*(3-4) ) /2)  得  +1/*2-342  ( 未加括號時 ,  同等順序的運算子以左側為優先 )    (1+2* ( (3-4)/2 ) )  得  +1*2/-342
7-4  後序表示法求值 由左往右掃描字元,一次取出一個資料 d i 。 如果 d i 是運算元,放入堆疊。 如果 d i 是運算子,依此運算子所需的運算元個數,從堆疊中取出計算,計算結果再放回堆疊。 如果資料處理完畢,取出堆疊的值,即是答案。
7-4 後序表示法轉換機器碼

More Related Content

PDF
Js is js(程劭非) (1)
PDF
C語言標準輸出入函式
PPTX
Scala再探
PPTX
0710 php學習進度(1)
PDF
C語言結構與串列
PDF
Python程式設計 - 分支作業
PPT
07 陣列與字串
PDF
C語言分支流程
Js is js(程劭非) (1)
C語言標準輸出入函式
Scala再探
0710 php學習進度(1)
C語言結構與串列
Python程式設計 - 分支作業
07 陣列與字串
C語言分支流程

What's hot (20)

PPTX
關於Import
PDF
C語言陣列與字串
PDF
Ppt 120-126
PDF
Python程式設計 - 基本資料運算
PPT
08 指標
PDF
C語言列舉與聯合
PPT
Ch6 函式
PDF
Python 迴圈作業
PPT
PPTX
Deferred execution
PDF
Ch 8
PDF
Ppt 138-142
PDF
Python分支作業
PPT
09 結構、聯合、列舉與定義型態
PDF
Python變數與資料運算
PDF
Ppt 136-140
PDF
從 C 語言的角度入門 php
PDF
C語言應用前置處理
PPTX
C++基礎程式設計 ch5 陣列
PDF
Ppt 127-135
關於Import
C語言陣列與字串
Ppt 120-126
Python程式設計 - 基本資料運算
08 指標
C語言列舉與聯合
Ch6 函式
Python 迴圈作業
Deferred execution
Ch 8
Ppt 138-142
Python分支作業
09 結構、聯合、列舉與定義型態
Python變數與資料運算
Ppt 136-140
從 C 語言的角度入門 php
C語言應用前置處理
C++基礎程式設計 ch5 陣列
Ppt 127-135
Ad

Similar to Chap 07 (20)

PDF
Python系列2
PDF
系統程式
PPT
1 C入門教學
PPT
C語言 第五章 程式流程控制
PPTX
Chapter 3 basic syntax and operator
PDF
資料結構-20個經典題型
PPTX
C語言重要觀念快速複習與基本資料結構之觀念(適合資工電機相關科系,大一程度閱讀)
DOCX
系統程式 -- 第 7 章 高階語言
PDF
系統程式 -- 第 7 章
PPT
SCJP ch04
DOCX
系統程式 -- 第 3 章 組合語言
PPTX
20161209-Julia Taiwan first meetup-julia語言入門
PPTX
ncuma_型別與迴圈.pptx
PDF
Ch1 教學
PPTX
ncuma_串列.pptx
PDF
Ppt 51-77
PDF
Ppt 51-77
PPT
Ch05
PDF
Kid171 chap06
PDF
9789572239940 試閱章節
Python系列2
系統程式
1 C入門教學
C語言 第五章 程式流程控制
Chapter 3 basic syntax and operator
資料結構-20個經典題型
C語言重要觀念快速複習與基本資料結構之觀念(適合資工電機相關科系,大一程度閱讀)
系統程式 -- 第 7 章 高階語言
系統程式 -- 第 7 章
SCJP ch04
系統程式 -- 第 3 章 組合語言
20161209-Julia Taiwan first meetup-julia語言入門
ncuma_型別與迴圈.pptx
Ch1 教學
ncuma_串列.pptx
Ppt 51-77
Ppt 51-77
Ch05
Kid171 chap06
9789572239940 試閱章節
Ad

Chap 07

  • 2. 第七章–堆疊 本章各段大綱 7-1 堆疊概觀 7-2 堆疊的資料結構 7-3 運算式的應用 7-4 後序表示法求值
  • 3. 7-1 堆疊概觀 - 定義 「堆疊」( stack ) 抽象的邏輯結構 是將物件疊放在一起,且一個一個往上堆放 要拿取物件時,則只能從最上層取出,不能從中間取出物件 堆疊的定義 : 堆疊是一個有序串列( ordered list ),而且只能在一個特定的出入口進行資料的增加或刪除。
  • 4. 7-1 堆疊概觀 - 特性與應用 堆疊的特性 先進後出 ( First in last out , FILO ) 後進先出 ( Last in first out , LIFO ) 加入元素到堆疊中稱為推入( push ) 自堆疊中取出元素稱為彈出( pop ) 堆疊的應用 cpu 動作 運算式的處理 副程式的呼叫
  • 5. 7-1 堆疊概觀 - 範例
  • 6. 7-2 堆疊的資料結構 define maxtop 100; char stack[maxtop+1]; 或 int stack[maxtop+1]; int top=-1;
  • 7. 7-2 堆疊的資料結構 判斷堆疊是否已滿      if (top==maxtop)      … /*stack 已滿 */      else      … /*stack 未滿 */      end if 判斷堆疊是否為空      if (top==-1)      … /*stack 為空 */      else      … /*stack 不為空 */      end if
  • 8. 7-2 堆疊的資料結構 將資料放入堆疊 Push   stack[++top]=data; // 先執行 top=top+1, 再執行 stack[top]=data 將資料從堆疊取出 Pop   return stack[top--]; // 先傳回 stack[top], 再執行 top=top-1 // 請注意 此式不等同於 return stack[top]; top--;
  • 9. 7-3 運算式的應用 電腦處理算術運算式一次作一個運算 , 複雜的運算式必須轉換為多個獨立的單一運算式 才能運算,由編譯器負責,運用 堆疊結構 進行轉換 中序表示法 當把運算式寫成 ((1+2)*3)-4/2)+5 ,運算子( + 、 - 、 * 、 / )的左右兩邊是運算元時,此種式子稱為中序表示法 後序表示法 後序表示法是將中序表示法中的運算子和運算元素重新調整順序,使得 運算子放於運算元後面 的表示法 前序表示法 前序表示法和後序表示法相類似,只是 運算子的順序是在運算元前面
  • 10. 7-3 運算式的應用 - 運算子優先次序 優先順序 運算子 1 括號() 2 負號 - 3 * 、 / 、 % 4 + 、 - 5 < 、 <= 、 >= 、 > 6 == 、 != 7 && 8 ||
  • 11. 7-3 運算式的應用 由中序表示法轉換成後序表示法的方法有兩種: 加括號去除法 :這種方法是人類使用的方法,主要是應付於考試,想快速得到後序表示法時使用。 堆疊處理法 : 由左而右 掃描資料,依據資料是運算元或運算子作不同的處理,運算子還要考慮其優先次序。
  • 12. 7-3 運算式的應用 - 中序轉後序之 加括號去除法 在所有的運算子左右的運算元外加上括號 再由內而外將括號去除,去除括號時依序排列它的兩個運算子,且運算子搬到這兩個運算元之後,依此類推至所有括號都去除
  • 13. 7-3 運算式的應用 - 中序轉後序之 堆疊處理法 由中序表示法轉換後序表示法的演算步驟 ( 僅需使用堆疊改變運算子的順序 ) 由左而右 依序取得資料 d i 如果 d i 是運算元 , 直接輸出 如果 d i 是運算子 ( 包含左右括號 ), 則 : 如果 d i = “ ( ”, 放入堆疊 如果 d i = “ ) ” , 依序輸出堆疊中的運算子 , 直到取出 “ ( ” 為止 如果 d i 不是 “ ( ” 或 “ ) ”, 則與堆疊頂點的運算子 d s 作優先順序比較 d i 較 d s 優先時 , d i 放入堆疊 d i 不較 d s 優先或相等時 , d s 輸出 , d i 放入堆疊 如果運算式已經讀取完成 , 而堆疊中尚有運算子時 , 依序由頂端輸出 d s 置入堆疊中 , 必為運算子 d i 較 d s 優先 d s d i 運算元 -- 數字等 d s d i 運算子 -- “(” d s d i 運算子 -- “)” d s ( d s d i 不較 d s 優先或相等 d s
  • 14. 7-3 運算式的應用 - 中序轉後序之 堆疊處理法
  • 15. 7-3 運算式的應用 中序表示法轉換前序表示法有兩種方法: 加括號去除法 堆疊處理法
  • 16. 7-3 運算式的應用 - 中序轉前序、加括號去除法 加上括號會因為優先順序不同而造成不同結果
  • 17. 7-3 運算式的應用 - 中序轉前序、堆疊處理法 1. 由右而左 依序取得資料 d i 。 2. 如果 d i 是運算元,直接輸出。 3. 如果 d i 是運算子(含左右括號),則 如果 d i =&quot;)&quot; ,放入堆疊 如果 d i =&quot;(&quot; ,依次輸出堆疊中的運算子,直到取出 &quot;)&quot; 為止 如果 d i 不是“ )” 或“ (” ,則與堆疊頂點的運算子 d s 作優先順序比較 d i 較 d s 優先時, d i 放入堆疊,迴圈輸出堆疊資料,直到優先次序相等 d i 不較 d s 優先或相等時, d s 輸出, d i 放入堆疊 4. 如果運算式已讀取完成,而堆疊中尚有運算子時,依序由頂端輸出 。 範例三 若以括號表示法 1+2*(3-4)/2  (1+ ( 2*(3-4) ) /2) 得 +1/*2-342 ( 未加括號時 , 同等順序的運算子以左側為優先 )  (1+2* ( (3-4)/2 ) ) 得 +1*2/-342
  • 18. 7-4 後序表示法求值 由左往右掃描字元,一次取出一個資料 d i 。 如果 d i 是運算元,放入堆疊。 如果 d i 是運算子,依此運算子所需的運算元個數,從堆疊中取出計算,計算結果再放回堆疊。 如果資料處理完畢,取出堆疊的值,即是答案。