Chap 3 堆疊與佇列 Stack and Queue.

Slides:



Advertisements
Similar presentations
南通大学江海书画社.
Advertisements

第五章 企业所得税、个人所得税.
迷 宫 最短路径 施沈翔.
服务热线: 菏泽教师招聘考试统考Q群: 菏泽教师统考教育基础模拟题解析.
動畫與遊戲設計 Data structure and artificial intelligent
第五章 经纪业务相关实务.
第四节 会计监督.
第七章 财务报告 财务报告 第一节 财务报告概述 一、财务报告及其目标: 1、概念:财务报告是指企业对外提供的反映企业某一特定日期
线索一 线索二 复习线索 专题五 线索三 模块二 第二部分 考点一 高考考点 考点二 考点三 配套课时检测.
2014高考 地理专题复习 行星地球.
資料結構與C++程式設計進階 資料結構概論 講師:林業峻 CSIE, NTU 6/ 7, 2010.
第十章 行政事业单位会计.
書名 Java於資料結構與演算法之實習應用
江苏省2009年普通高校 招生录取办法 江苏省教育考试院
Chapter 3: Stack.
第三章 堆疊與佇列的基本應用 3-1 簡介堆疊(Stack) 3-2 迷宮問題研究 3-3 佇列(queue)的介紹
Linked List(串列) Why Linked List? Pointer Dynamic Allocation
佇列 (Queue).
佇列與推疊 (Queue and Stack)
資料結構簡介.
4.4 佇列 特徵: c b a c b d c b 新增 d 刪除 入口 入口 入口 尾端(rear) 尾端(rear) 尾端(rear)
資料結構 第5章 佇列.
大綱 Labview 環境介紹 數值(Numeric) 布林值(Boolean)與比較(Comparison) 結構(Structure)
If … else 選擇結構 P27.
Ch13 集合與泛型 物件導向程式設計(2).
·线性表的定义及ADT ·线性表的顺序存储结构 ·线性表的链接存储结构 · 单向循环链表 · 双链表、双向循环链表 · 一元多项式的加法
第十五章 Linked List, Stack and Queue
4 堆疊與佇列 4.1 前言 四種基本的資料結構 (可儲存資料的容器) 陣列 (Array)、串列(List): 最基本
cn/~dongeliu/dsa.html 刘 东 信息学院6系 中国科学技术大学
堆疊 Stack chapter 4 德明科技大學資訊科技系.
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第3章 堆栈和队列 堆栈 堆栈应用 队列 队列应用 优先级队列 主要知识点.
第三章 栈与队列 £3.1 栈 £3.3 队列 £3.2 栈的应用举例 £3.1.1 栈的定义 £3.1.2 栈的顺序存储结构
第3章 栈和队列(一).
第三章 栈和队列.
数据结构 Data Structure 中南大学 主讲人:王国军,郑瑾 中南大学信息院计科系
資料結構與C++程式設計進階 堆疊與佇列(Stack & Queue) 講師:林業峻 CSIE, NTU 6/ 21, 2010.
第一章 绪论.
五、链 表 1、单链表 2、双向链表 3、链表应用.
Data Structure.
佇列(queue) Lai Ah Fur.
二叉树和其他树 (Binary and other trees)
第三章 栈和队列.
資料結構 第4章 堆疊.
严蔚敏、吴伟民编著 清华大学出版社 学习网站:
第四章 堆疊與佇列 課前指引 資料結構學科中,堆疊(Stack)與佇列是兩種相當典型的抽象資料型態,也是一種有特定進出規則的線性串列應用,主要特性是限制了資料插入與刪除的位置和方法。本章中將會介紹堆疊與佇列的概念與特性,及在計算機領域的各種相關應用。
樹 2 Michael Tsai 2013/3/26.
第三章 链表 单链表 (Singly Linked List) 循环链表 (Circular List) 多项式及其相加
4.8 平行线 海南华侨中学 王应寿.
如图:直线AB、CD相交于O,图中有哪些角具有特殊位置关系?这些角数量上有什么关系?
Chapter6 队列(Queues) The Abstract Data Type
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
top b top a a top 空栈 a 进栈 b 进栈 top top e e e top d d d c c c b b b a a
数 据 结 构 与 算 法.
Linked Lists Prof. Michael Tsai 2013/3/12.
Chap2 Stack & Queue.
第四章 栈和队列 栈 ( Stack ) 队列 ( Queue ) 优先队列 (Priority Queue) 小结.
基础会计.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
第 六 讲 栈和队列(一).
1. 志明打算就客戶服務開發一個語音互動(IVR)系統, 顧客可透過電話鍵盤與系統進行互動。
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
 第四章 消费税法律制度 经济法基础 模板来自于
计算机问题求解 – 论题 基本的数据结构 2018年05月09日.
Data Structure.
Chapter 2 Entity-Relationship Model
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
13-1 電腦可以協助解決哪些問題 13-2 電腦解題簡介 13-3 電腦解題規劃-演算法 13-4 認識資料結構
Presentation transcript:

Chap 3 堆疊與佇列 Stack and Queue

堆疊(Stack) 堆疊的定義:堆疊是一個有序串列,它的插入、刪除都在被稱為top的這端做。因此堆疊也被稱為後進先出 Last-In-First-Out (LIFO) list.

Stack (Cont.) 給定一個陣列 S = (a0, …, an-1), a0 為最底端的元素, an-1 為最頂端的元素, ai 位於 ai-1的上面, 0 < i < n. a3 a3 a2 a2 a1 a1 a0 a0 Push (Add) Pop (Delete)

系統堆疊 當一個函數被呼叫時, 程式會建立一個稱為活動記錄(activation record)或是堆疊框 (stack frame)的結構, 並且把它放在系統堆疊最上端. previous frame pointer fp return address a1 local variables previous frame pointer fp previous frame pointer return address main return address main

ADT 3.1 堆疊的抽象資料型態 Template <class KeyType> class Stack { // objects: A finite ordered list with zero or more elements public: Stack (int MaxStackSize = DefaultSize); // Create an empty stack whose maximum size is MaxStackSize Boolean IsFull(); // if number of elements in the stack is equal to the maximum size // of the stack, return TRUE(1) else return FALSE(0) void Add(const KeyType& item); // if IsFull(), then StackFull(); else insert item into the top of the stack. Boolean IsEmpty(); // if number of elements in the stack is 0, return TRUE(1) else return FALSE(0) KeyType* Delete(KeyType& ); // if IsEmpty(), then StackEmpty() and return 0; // else remove and return a pointer to the top element of the stack. };

利用陣列實現堆疊 an-1 a2 a1 a0 a0 a1 a2 an-1 Array index 1 2 3 n-1

佇列(Queue) 佇列是一個有序串列, 它的插入、 刪除發生在不同端。 加入新元素的那一端稱為後端(rear) , 而刪除舊元素的那一端稱為前端(front). 它也被稱為 First-In-First-Out (FIFO) . a0 a1 a2 an-1 front rear

ADT 3.2 佇列的抽象資料型態 Template <class KeyType> class Queue { // objects: A finite ordered list with zero or more elements public: Queue(int MaxQueueSize = DefaultSize); // Create an empty queue whose maximum size is MaxQueueSize Boolean IsFull(); // if number of elements in the queue is equal to the maximum size of // the queue, return TRUE(1); otherwise, return FALSE(0) void Add(const KeyType& item); // if IsFull(), then QueueFull(); else insert item at rear of the queue Boolean IsEmpty(); // if number of elements in the queue is equal to 0, return TRUE(1) // else return FALSE(0) KeyType* Delete(KeyType&); // if IsEmpty(), then QueueEmpty() and return 0; // else remove the item at the front of the queue and return a pointer to it };

佇列操作問題 一般使用陣列來實現佇列. 然而為了維持佇列空間上的充分利用, 在佇列上進行插入或刪除時必須對佇列內的元素進行移動. 在最差情形下其時間複雜度將達O(MaxSize).

佇列元素的變動 front rear front rear front rear

環狀佇列 為解決佇列中元素移動的問題, 在環狀佇列中當 rear == MaxSize – 1時指定下一個元素為q[0] 佇列的前端元素會依順時鐘方向會在指標 front 的後一個位置上. 問題:當 front = rear 時佇列是空的. 然而這條件亦適用於當佇列滿了的時候.

環狀佇列 4 4 n-4 n-4 3 3 n-3 n-3 2 2 n-2 n-2 1 1 n-1 n-1 J4 J3 n-4 n-4 3 3 J1 J2 n-3 n-3 J2 2 J1 2 J3 J4 n-2 n-2 1 1 n-1 n-1 front = 0; rear = 4 front = n-4; rear = 0

環狀佇列 判斷若 front == rear 時代表佇列為空的或滿的的方法之一為限制佇列中最多僅能儲存 MaxSize – 1個元素. 每一次當佇列中需要加入一個新的元素時, 會利用指標newrear 進行判斷. 若 newrear == front 時代表佇列滿了. 另一種解決方式為使用 flag 指標來記錄佇列上一次的運算. 此法的缺點為會降低 Add 與 Delete 函數的速度.

迷宮問題 Entrance Exit

移動方向 N [i-1][j-1] [i-1][j] [i-1][j+1] NE NW W [i][j-1] X [i][j+1] E SW S SE

迷宮問題 通常解決迷宮問題時常用堆疊來儲存已走過之路徑的方向和座標. 使用另外一個 mxp 維度的陣列來記錄哪些位置已經走訪過.

運算式的計算 運算式中運算子的優先順序. Priority Operator 1 2 3 4 5 6 7 Unary minus, ! *, /, % 3 +, - 4 <, <=, >=, > 5 ==, != 6 && 7 ||

後置表示法(postfix notation) 在編譯過程中運算式必須先轉換成後置表示法,之後編譯器方能產生正確機械碼. X = A/B – C + D * E – A * C Infix A/B–C+D*E–A*C Postfix => AB/C-DE*+AC*- Operation Postfix T1 = A / B T1C-DE*+AC*- T2 = T1 - C T2 DE*+AC*- T3 = D * E T2T3+AC*- T4 = T2 + T3 T4AC*- T5 = A * C T4 T5 - T6 = T4 - T5 T6

後置表示法(postfix notation)的產生 X = A+ B* C / D – E * F 後置式: ABC*D/+EF*- 輸出 A A AB AB ABC ABC* ABC* ABC*D + + * + * + + / + / + 堆疊 輸出 ABC*D/ ABC*D/+ ABC*D/+E ABC*D/+E ABC*D/+EF + - - * - * - 堆疊

後置表示法(postfix notation)的產生 X = A+ (B+C*D) – E 後置式: ABCD*++E– 輸出 A A A AB AB ABC ABC ABCD ABCD* + ( + ( + + ( + ( * + ( * + ( + ( 堆疊 輸出 ABCD*+ ABCD*+ ABCD*++ ABCD*++E ABCD*++E- ( + + - - 堆疊

後置表示法(postfix notation)的運算 後置式: ABC*D/+EF*- A B A C B A B*C A D B*C A B*C/D A A+B*C/D 堆疊 E A+B*C/D F E A+B*C/D E*F A+B*C/D A+B*C/D-E*F

多堆疊與多佇列 兩個堆疊: 超過兩個堆疊 Stack A Stack B 1 2 3 4 m-4 m-3 m-2 m-1 m-1 b[0] 1 2 3 4 m-4 m-3 m-2 m-1 Stack A Stack B m-1 b[0] b[1] b[2] b[n] t[0] t[1] t[2] t[n]