Stack(堆疊) 堆疊的定義 簡單的應用範例 Stack ADT

Slides:



Advertisements
Similar presentations
第一讲:导论 The Introduction  哲学与中国哲学  哲学与哲学史  中国哲学史的历史.
Advertisements

While 迴圈 - 不知重複執行次數
第一單元 建立java 程式.
第 4 章 PHP 基本語法.
動畫與遊戲設計 Data structure and artificial intelligent
第一章 C语言概述 计算机公共教学部.
陳維魁 博士 儒林圖書公司 第九章 資料抽象化 陳維魁 博士 儒林圖書公司.
Operators and Expressions
Chapter 3: Stack.
第三章 堆疊與佇列的基本應用 3-1 簡介堆疊(Stack) 3-2 迷宮問題研究 3-3 佇列(queue)的介紹
Linked List(串列) Why Linked List? Pointer Dynamic Allocation
第 3 章 堆疊與佇列.
主讲教师:吴琼 微信群:C语言2016 QQ群: 密码scu2016 昵称:“真名+学号”
佇列 (Queue).
佇列與推疊 (Queue and Stack)
資料結構設計與C++程式應用 Fundamentals of Data Structures and Their Applications Using C++ 第3章 佇列 資料結構設計與C++程式應用.
資料結構簡介.
第三章 堆疊與佇列 Stacks & Queues
C++Primer 3rd edition 中文版 Chap 5
Chap 3 堆疊與佇列 Stack and Queue.
C 程式設計— 控制敘述 台大資訊工程學系 資訊系統訓練班.
·线性表的定义及ADT ·线性表的顺序存储结构 ·线性表的链接存储结构 · 单向循环链表 · 双链表、双向循环链表 · 一元多项式的加法
4 堆疊與佇列 4.1 前言 四種基本的資料結構 (可儲存資料的容器) 陣列 (Array)、串列(List): 最基本
C語言簡介 日期 : 2018/12/2.
C 語言簡介 - 2.
线性表小结 元素之间的线性关系 顺序表 顺序表:元素相邻存储 单链表:后继指针链接 一维数组 给定下标随机存取
cn/~dongeliu/dsa.html 刘 东 信息学院6系 中国科学技术大学
(Circular Linked Lists)
Methods 靜宜大學資工系 蔡奇偉副教授 ©2011.
堆疊 Stack chapter 4 德明科技大學資訊科技系.
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
變數命名 保留字(Reserved Word)
第三章 栈与队列 £3.1 栈 £3.3 队列 £3.2 栈的应用举例 £3.1.1 栈的定义 £3.1.2 栈的顺序存储结构
第三章 栈和队列 3.1 栈 3.2 栈的应用举例 3.3 栈与递归的实现 3.4 队列.
第3章 栈和队列(一).
第三章 栈和队列.
数据结构 Data Structure 中南大学 主讲人:王国军,郑瑾 中南大学信息院计科系
本章中將會更詳細地考慮有關重複的概念,並且會 介紹for和do…while等兩種用來控制重複的敘述 式。 也將會介紹switch多重選擇敘述式。 我們會討論直接和迅速離開某種控制敘述式的 break敘述式,以及用來跳過重複敘述式本體剩餘 部份的continue敘述式。 本章會討論用來組合控制條件的邏輯運算子,最後.
第三章 栈和队列.
資料結構 第4章 堆疊.
严蔚敏、吴伟民编著 清华大学出版社 学习网站:
第四章 堆疊與佇列 課前指引 資料結構學科中,堆疊(Stack)與佇列是兩種相當典型的抽象資料型態,也是一種有特定進出規則的線性串列應用,主要特性是限制了資料插入與刪除的位置和方法。本章中將會介紹堆疊與佇列的概念與特性,及在計算機領域的各種相關應用。
樹 2 Michael Tsai 2013/3/26.
程式設計實習課(四) ----C 函數運用----
第三章 链表 单链表 (Singly Linked List) 循环链表 (Circular List) 多项式及其相加
第一單元 建立java 程式.
感謝同學們在加分題建議. 我會好好研讀+反省~
資料結構 優點 缺點 1 陣列 (Array) 沒有額外變量 (例head, next,...) 運作/操作較簡單 更新資料時,若要保持順序,需要移動較大量資料 靜態結構Static (宣告時已決定了陣列元素多少,不能在程式執行期間增減元素) 2 隊列Queue (FIFO) 容易更新 加入enqueue:
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
第3章 Java語法的JSP程式 3-1 Java語言的基礎 3-2 JSP程式的基本架構 3-3 Java的變數與資料型態
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
第五章 递归与广义表 递归的概念 递归过程与递归工作栈 递归与回溯 广义表.
Chapter 2 基本語法.
CH05. 選擇敘述.
挑戰C++程式語言 ──第8章 進一步談字元與字串
Chap2 Stack & Queue.
第四章 栈和队列 栈 ( Stack ) 队列 ( Queue ) 优先队列 (Priority Queue) 小结.
Lucene 算法介绍 IR-Lab 胡晓光.
如何使用Gene Ontology 網址:
Class & Object 靜宜大學資工系 蔡奇偉副教授 ©2011.
第6章 運算式與運算子 [算術與多功能計算機]
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第 六 讲 栈和队列(一).
流程控制:Switch-Case 94學年度第一學期‧資訊教育 東海大學物理系.
本章主題 C++的程式結構 資料型態與宣告 算術運算 簡易的輸入輸出指令 程式編譯(Compile)的過程與原理.
计算机问题求解 – 论题 基本的数据结构 2018年05月09日.
第6章 PHP基本語法介紹.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
InputStreamReader Console Scanner
Presentation transcript:

Stack(堆疊) 堆疊的定義 簡單的應用範例 Stack ADT Stack ADT Implementation Based on Array 應用範例 A Mazing Problem Evaluation of Expression

Stack(堆疊) 前述的 list ADT 中,函數: ListInsert (NewItem, Position, Success) ListDelete (Position, Success) 允許我們刪除有效位置 Position 上的資料。函數: ListRetrieve (Position, DataItem, Success) 允許我們取出有效位置 Position 上的資料。

換句話說,ADT list 的資料插入、刪除、和讀取「蠻自由的」 。如果我們取消這樣的自由而限制 只能在資料列固定的某一端插入、刪除、和讀取資料 的話,那麼我們就得到所謂的「堆疊(stack)」抽象資料型 態了。插入和刪除的那一端稱為 top。 66 Top (插入/刪除) 98 資料儲存區 21 18 26 45

Push operation 將資料加入堆疊的動作稱為 push(壓入)。 33 66 66 push 33 98 98 21 21 18 Top 66 Top 66 push 33 98 98 21 21 18 18 26 26 45 45

Pop operation 將資料從堆疊中刪除的動作稱為 pop(彈出)。 66 66 pop 98 98 21 21 18 18 26 Top 66 pop 98 98 Top 21 21 18 18 26 26 45 45

簡單的應用範例 Checking for Balanced Braces Requirements for balanced braces: 1. Each time you encounter a "}", it matches an already encountered "{". 2. When you reach the end of the string, you have matched each "{". abc{defg{ijk}{l{mn}}op}rr abc{def}}{ghij{kl}m

Stack as algorithm executes Input string Stack as algorithm executes {a{b}c} 1. Push '{' 2. Push '{' 3. Pop 4. Pop Stack empty ==> balanced { { { {a{bc} 1. Push '{' 2. Push '{' 3. Pop Stack not empty ==> not balanced { { { {ab}c} 1. Push '{' 2. Pop Stack empty when last '}' ==> not balanced {

解法: while (not at the end of the string) { c = GetNextChar(); if ( c is a '{' ) Push '{' into the stack; else if ( c is a '}' ) { if (Stack is empty) return FALSE; Pop the stack; } return (stack is empty)? TRUE : FALSE;

另解 int counter = 0; while (not at the end of the string) { c = GetNextChar(); if ( the next character is a '{' ) counter++; else if ( the next character is a '}' ) { counter--; if (counter < 0) return false; } return (counter == 0) ? true : false; abc{defg{ijk}{l{mn}}op}rr 1 2 3 abc{def}}{ghij{kl}m 1 -1

Recognizing palindromes A string is called a palindrome if it is the same when reading forward and backward. 為了簡化問題起見,此處我們假設字串中含有單一個 字元 $,此字元區分字串為兩半部,如下圖所示: a b c d e f $ f e d c b a a b c d e f $ f e d k b a X YES NO

作法示範:假定字串為 a b c d e f $ f e d c b a (一)將 $ 之前的字元依序 push 至堆疊中 a b c d e f $ f e d c b a top b a c d e f $ f e d c b a top

(二)碰到 $ 字元 ,捨棄 $ 字元後, 不再 push 其後的字 元至 stack 中,而進 入比較階段。 c b a d e f $ f e d c b a top d c b a e f $ f e d c b a top e d c b a f $ f e d c b a top f e d c b a $ f e d c b a top f e d c b a f e d c b a top (二)碰到 $ 字元 ,捨棄 $ 字元後, 不再 push 其後的字 元至 stack 中,而進 入比較階段。

(三)在這個階段,我們比較 stack 中由上而下的字元和 $ 之後 剩餘的字元,如下所示: f e d c b a f e d c b a top e d c b a e d c b a top d c b a d c b a top c b a c b a top b a b a top a top

則此字串是一個 palindrom,否則不是一個 palindrom。 (四)若比較之後,下列三個條件都成立: (1) 相比的字元一樣; (2) stack 變成空的; (3) 沒有剩餘的字元; 則此字串是一個 palindrom,否則不是一個 palindrom。 a top c b a k b a top c b a top c b a top YES NO NO NO

Stack ADT OBJECTS: a finite list with zero or more elements. FUNCTIONS: Stack Create(max_stack_size) Boolean IsFull(stack, max_stack_size) Boolean IsEmpty(stack) boolean Push (stack, item) boolean Pop (stack) boolean GetTop (stack, top_item)

Stack 又稱為 LIFO ( Last In First Out ): Create (S); Push (S, 1); Push (S, 2); Push (S, 3); Push (S, 4); 1 2 1 3 2 1 4 3 2 1 4 3 2 1 3 2 1 2 1 1 Pop(S);

Stack ADT Implementation Based on Array 靜宜大學資訊管理學系 資料結構講義 2018/11/28 Stack ADT Implementation Based on Array /** ** FILE : StackA.h **/ #define MAX_STACK 100 typedef int itemType; typedef enum {FALSE, TRUE} boolean; typedef struct { int Top; itemType Items[MAX_STACK]; } stack; 1 2 MAX_STACK - 1 k Top Items 蔡奇偉副教授 編製

boolean IsEmpty (stack *S) return (S->Top == -1) TRUE : FALSE; /** ** FILE: StackA.c **/ #include “StackA.h” void Create (stack *S) { S->Top = -1; } boolean IsEmpty (stack *S) return (S->Top == -1) TRUE : FALSE; boolean IsFull (stack *S) return (S->Top >= MAX_STACK-1) TRUE : FALSE; 1 2 MAX_STACK - 1 k Top Items

boolean Push (stack *S, itemType NewItem) { if (IsFull(S)) return FALSE; S->Items[++S->Top] = NewItem; return TRUE; } MAX_STACK - 1 MAX_STACK - 1 Push(&S, 41) k+1 k+1 41 k+1 k 12 k 12 k Top Top 25 2 25 2 36 1 36 1 77 77 Items Items

boolean Pop (stack *S) { if (IsEmpty(S)) return FALSE; --S->Top; return TRUE; } MAX_STACK - 1 MAX_STACK - 1 Pop(&S) k 41 k k 12 k-1 k-1 12 k-1 Top Top 25 2 25 2 36 1 36 1 77 77 Items Items

boolean GetTop (stack *S, itemType *TopItem) { if (IsEmpty(S)) return FALSE; *TopItem = S->Items[S->Top]; return TRUE; } MAX_STACK - 1 GetPop(&S, &TopItem) k 41 k+1 TopItem = 41 12 k Top 25 2 36 1 77 Items

A Mazing Problem 0 1 0 0 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 0 1 1 1 0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 0 1 1 0 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 1 0 0 1 1 1 1 1 0 1 1 1 1 0 0 : open 1 : close N E W NE SE NW SW S

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 3 4 5 6 7 8 9 10 11 0 1 0 0 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 0 1 1 1 0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 0 1 1 0 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 1 0 0 1 1 1 1 1 0 1 1 1 1 0 1 2 3 4 5 6 7 8 9 1 1 SE row col dir

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 3 4 5 6 7 8 9 10 11 0 1 0 0 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 0 1 1 1 0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 0 1 1 0 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 1 0 0 1 1 1 1 1 0 1 1 1 1 0 1 2 3 4 5 6 7 8 9 2 2 NE 1 1 SE row col dir

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 3 4 5 6 7 8 9 10 11 0 1 0 0 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 0 1 1 1 0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 0 1 1 0 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 1 0 0 1 1 1 1 1 0 1 1 1 1 0 1 2 3 4 5 6 7 8 9 1 3 E 2 2 NE 1 1 SE row col dir

靜宜大學資訊管理學系 資料結構講義 2018/11/28 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 3 4 5 6 7 8 9 10 11 0 1 0 0 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 0 1 1 1 0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 0 1 1 0 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 1 0 0 1 1 1 1 1 0 1 1 1 1 0 1 2 3 4 5 6 7 8 9 1 4 E 1 3 E 2 2 NE 1 1 SE row col dir 蔡奇偉副教授 編製

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 3 4 5 6 7 8 9 10 11 0 1 0 0 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 0 1 1 1 0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 0 1 1 0 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 1 0 0 1 1 1 1 1 0 1 1 1 1 0 1 2 3 4 5 6 7 8 9 1 5 SW 1 4 E 1 3 E 2 2 NE 1 1 SE row col dir

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 3 4 5 6 7 8 9 10 11 0 1 0 0 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 0 1 1 1 0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 0 1 1 0 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 1 0 0 1 1 1 1 1 0 1 1 1 1 0 1 2 3 4 5 6 7 8 9 2 4 SE 1 5 SW 1 4 E 1 3 E 2 2 NE 1 1 SE row col dir

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 3 4 5 6 7 8 9 10 11 0 1 0 0 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 0 1 1 1 0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 0 1 1 0 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 1 0 0 1 1 1 1 1 0 1 1 1 1 0 4 14 E 17 3 13 SE 16 3 12 E 15 1 4 E 3 1 3 E 2 2 2 NE 1 1 1 SE row col dir

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 3 4 5 6 7 8 9 10 11 0 1 0 0 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 0 1 1 1 0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 0 1 1 0 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 1 0 0 1 1 1 1 1 0 1 1 1 1 0 4 14 E 17 3 13 SE 16 3 12 E 15 1 4 E 3 1 3 E 2 2 2 E 1 1 1 SE Backtracking row col dir

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 3 4 5 6 7 8 9 10 11 0 1 0 0 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 0 1 1 1 0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 0 1 1 0 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 1 0 0 1 1 1 1 1 0 1 1 1 1 0 3 13 SE 16 3 12 E 15 1 4 E 3 1 3 E 2 2 2 E 1 1 1 SE Backtracking row col dir

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 3 4 5 6 7 8 9 10 11 0 1 0 0 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 0 1 1 1 0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 0 1 1 0 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 1 0 0 1 1 1 1 1 0 1 1 1 1 0 3 6 NE 9 3 5 E 8 1 4 E 3 1 3 E 2 2 2 E 1 1 1 SE Backtracking row col dir

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 3 4 5 6 7 8 9 10 11 0 1 0 0 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 0 1 1 1 0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 0 1 1 0 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 1 0 0 1 1 1 1 1 0 1 1 1 1 0 3 6 E 9 3 5 E 8 1 4 E 3 1 3 E 2 2 2 E 1 1 1 SE row col dir

代數運算 Infix, Postfix, and Prefix Expressions Evaluation of Postfix Expressions Conversion from Infix to Postfix Expressions

從小我們就熟悉計算式 a+b 表示 「a 加上 b」,也知道「先乘除 後加減」這個口訣,所以 a+b*c 這個式子表示「 a 加上 b 乘 c 的 結果」 而不是「a 加 b以後再乘以 c」— 後者必須用括號寫為 ( a+b )*c。像 a+b 這樣的計算式寫法,我們稱之為中置算式 (infix expression),所以這樣稱呼,原因是運算子 + 擺在兩個 運算元 a 和 b 之間。 有沒有必要一定這樣寫呢?譬如:我們是否 可以將同樣的算式寫成 前置算式(prefix expression) + a b 或者後置算式(postfix expression) a b + 呢?雖然這兩種寫法看起來「怪怪的」,但是在電腦科學的領域 中卻常常會看到類似的寫法。

前置算式 + a b 可以看成 + (a, b) 而解讀為:「+ 代表 解釋任何 C 的函數: func (p1, p2, ..., pk) 都是前置算式,其中 func 是運算子,而參數 p1, p2, ..., pk 為其運算元。許多的函數型的程式語言,如 ML 和 LISP 等等,就是採用這樣的「函數即為運算子」 的觀點,如此一來,使得該類型程式語言的語法變 得簡鍊許多。 堆疊可以用於很有效率地計算後置算式。這個技巧用 於一些程式語言,如 FORTH 和用於雷射印表機的 Postscript。

計算後置算式 2 * ( 3 + 4 ) = 14 2 * 3 + 4 = 10 A - ( B / C * D ) 2 3 4 + * 2 * 3 + 4 = 10 A - ( B / C * D ) 2 3 4 + * 2 3 * 4 + A B C / D * - 7 6 10 A - ( B / C * D ) B / C B / C * D 14

2 * ( 3 + 4 ) = 14 2 3 4 + * 2 3 4 + * 4 + * 3 2 * 7 2 7 14 3 4 + * 2 + * 4 3 2 14

2 * 3 + 4 = 10 2 3 * 4 + 6 10 2 3 * 4 + * 4 + 3 2 + 4 6 3 * 4 + 2 4 + 6 10

Algorithm for calculating postfix expression Assumptions: The input string is a syntactically correct postfix expression. No unary operators are present. No exponentiation operators are present. Operands are single uppercase letters that represent integer values. A B C / D * - 【範例】

for (each character Ch in the string) { if (Ch is an operator named Op) { /* evaluate and push the result */ Operand2 = top of the stack Pop the stack Operand1 = top of the stack Result = Operand1 Op Operand2 Push Result onto stack } else /* Ch is an operand */ Push Ch onto stack

中置算式轉換為後置算式 從前面的例子,我們知道利用堆疊可以很容易地計算 後置算式。因此,計算中置算式可以分為底下的兩個 步驟來執行: 1. 將中置算式轉換為後置算式 2. 用堆疊來計算所得的後置算式

【範例】 2 * 3 + 4 = 10 2 3 * 4 + 6 10 2 * ( 3 + 4 ) = 14 2 3 4 + * 7 14

【範例】

Observations: 運算元的次序在中置算式和後置算式是完全相同的。 在中置算式中,如果運算元 X 在運算子 Op 之前, 那麼,在後置算式中,運算元 X 也會在運算子 Op 之前。 所有括號在轉換後均被消除。 運算子在後置算式中的出現順序是依照其在中置算式 的運算順序而定。

中置算式的運算法則 括號內算式先做 先乘除後加減 由左至右運算 A - ( B + C * D ) / E Þ ( A - ( ( B + ( C * D ) ) / E ) ) Þ ( A - ( ( B + C D *) / E ) ) Þ ( A - ( B C D * + / E ) ) Þ ( A - B C D * + E / ) Þ A B C D * + E / - A - B + C * D / E Þ ( ( A - B ) + ( ( C * D ) / E ) ) Þ ( A B - + ( ( C * D ) / E ) ) Þ ( A B - + ( C D * / E ) ) Þ ( A B - + C D * E / ) Þ A B - C D * E / +

中置算式轉換為後置算式的演算法 1. 當碰到運算元時,將其直接加附於輸出字串之後。 2. 當碰到左括號時,將其 push 至堆疊中。 3. 當碰到右括號時,將堆疊中的運算子 pop 出來並加 附於輸出字串之後直到碰到左括號為止,然後再將 此左括號 pop 掉。

4. 當碰到運算子時,若此時堆疊是空的,則直接將此 運算子加附於輸出字串之後;否則,將堆疊中運算 優先次序較高或相同的運算子 pop 出來並加附於輸 出字串之後直到下列條件成立為止 (i) 碰到左括號 (ii) 碰到優先次序較低的運算子 (iii) 堆疊變為空 然後將此輸入運算子 push 至堆疊中。 5. 當輸入字串全部處理完時,將堆疊中所剩餘的運算 子逐一地 pop 出來並加附於輸出字串之後直到堆疊 變為空為止。

Algorithm for ( each character ch in the infix expression ) { switch ( Ch ) { case operand : PE = PE‧Ch; break; case ‘(‘ : S.Push ( Ch, Success); break; case ‘)’ : while ( top of S is not ‘(‘ ) { pop down to the matching open ( PE = PE‧( top of S ); S.Pop (Success ); } S.Pop ( Success ); remove the open ( break; case operator: PE‧Ch : PE concatenate Ch

while ( !S.StackIsEmpty () and ( top of S is not ‘(‘ ) and 靜宜大學資訊管理學系 資料結構講義 2018/11/28 while ( !S.StackIsEmpty () and ( top of S is not ‘(‘ ) and ( Precedence ( top of S ) >= Precedence ( Ch ) ) { PE = PE‧( top of S ); S.Pop (Success ); } S.Push ( Ch, Success); while ( !S.StackIsEmpty () ) { add the remaining operators in the stack 蔡奇偉副教授 編製

【範例】 A - ( B + C * D ) / E A B C D * + E / - A A 1 - - A 4 ( - ( A 2 Ch Stack S ( bottom to top) PE rule A A 1 - - A 4 ( - ( A 2 B - ( A B 1 + - ( + A B 4 C - ( + A B C 1 * - ( + * A B C 4 D - ( + * A B C D 1

) - ( + A B C D * 3 - ( A B C D * + 3 - A B C D * + 3 / - / A B C D * + 4 E - / A B C D * + E 1 - A B C D * + E / 5 A B C D * + E / - 5