第 3 章 堆疊與佇列.

Slides:



Advertisements
Similar presentations
資料結構與演算法 課程教學投影片.
Advertisements

第一單元 建立java 程式.
项目五——校园一卡通程序功能模块化设计 5-1项目显示查询和退出函数设计.
第 5 章 流程控制 (一): 條件分支.
第三章 堆疊與佇列的基本應用 3-1 簡介堆疊(Stack) 3-2 迷宮問題研究 3-3 佇列(queue)的介紹
第6章 佇列(Queues) 6-1 佇列的基礎 6-2 佇列的表示法 6-3 環狀佇列 6-4 雙佇列.
Visual C++ introduction
課程名稱:資料結構 授課老師:_____________
佇列 (Queue).
佇列與推疊 (Queue and Stack)
資料結構設計與C++程式應用 Fundamentals of Data Structures and Their Applications Using C++ 第3章 佇列 資料結構設計與C++程式應用.
資料結構簡介.
4.4 佇列 特徵: c b a c b d c b 新增 d 刪除 入口 入口 入口 尾端(rear) 尾端(rear) 尾端(rear)
Chapter 3 堆疊與佇列 3.1 堆疊和佇列基本觀念 3.2 堆疊的加入與刪除 3.3 佇列的加入與刪除 3.4 其他型式的佇列
第三章 堆疊與佇列 Stacks & Queues
資料結構 第5章 佇列.
Chap 3 堆疊與佇列 Stack and Queue.
4 堆疊與佇列 4.1 前言 四種基本的資料結構 (可儲存資料的容器) 陣列 (Array)、串列(List): 最基本
cn/~dongeliu/dsa.html 刘 东 信息学院6系 中国科学技术大学
第一章 栈.
(Circular Linked Lists)
堆疊簡介 遞迴 佇列 算術運算式的表示法 中序轉換為前序或後序 前序與後序轉換成中序
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
資料結構與演算法 第三章 堆疊和佇列 徐熊健.
第3章 堆栈和队列 堆栈 堆栈应用 队列 队列应用 优先级队列 主要知识点.
第三章 栈与队列 £3.1 栈 £3.3 队列 £3.2 栈的应用举例 £3.1.1 栈的定义 £3.1.2 栈的顺序存储结构
第三章 栈和队列 3.1 栈 3.2 栈的应用举例 3.3 栈与递归的实现 3.4 队列.
第三章 栈和队列.
数据结构 Data Structure 中南大学 主讲人:王国军,郑瑾 中南大学信息院计科系
Chapter 3 堆疊與佇列 ( Stacks and Queues ).
資料結構與C++程式設計進階 堆疊與佇列(Stack & Queue) 講師:林業峻 CSIE, NTU 6/ 21, 2010.
Chapter 4 堆疊和佇列 資料結構導論 - C語言實作.
資料結構使用Java 第8章 佇列(Queue).
佇列(queue) Lai Ah Fur.
第三章 栈和队列.
严蔚敏、吴伟民编著 清华大学出版社 学习网站:
第四章 堆疊與佇列 課前指引 資料結構學科中,堆疊(Stack)與佇列是兩種相當典型的抽象資料型態,也是一種有特定進出規則的線性串列應用,主要特性是限制了資料插入與刪除的位置和方法。本章中將會介紹堆疊與佇列的概念與特性,及在計算機領域的各種相關應用。
第 四 章 堆疊(Stack) 課程名稱:資料結構 授課老師:________ 2019/2/23.
程式設計實習課(四) ----C 函數運用----
第一單元 建立java 程式.
Chapter 4 資料結構.
Chapter 4 資料結構.
資料結構 優點 缺點 1 陣列 (Array) 沒有額外變量 (例head, next,...) 運作/操作較簡單 更新資料時,若要保持順序,需要移動較大量資料 靜態結構Static (宣告時已決定了陣列元素多少,不能在程式執行期間增減元素) 2 隊列Queue (FIFO) 容易更新 加入enqueue:
自我參考結構 (self-reference – 1)
Chapter 3 堆疊與佇列 3.1 堆疊和佇列基本觀念 3.2 堆疊的機入與刪除 3.3 佇列的加入與刪除 3.4 環狀佇列
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
程式結構&語法.
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
挑戰C++程式語言 ──第8章 進一步談字元與字串
Chap2 Stack & Queue.
第四章 栈和队列 栈 ( Stack ) 队列 ( Queue ) 优先队列 (Priority Queue) 小结.
進階佇列.
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
Chap2 Stack & Queue.
流程控制:Switch-Case 94學年度第一學期‧資訊教育 東海大學物理系.
資料結構使用Java 第7章 堆疊(Stack).
第4章 堆疊和佇列 資料結構設計與C++程式應用
本节内容 指针类型.
第1章 数据结构基础概论 本章主要介绍以下内容 数据结构研究的主要内容 数据结构中涉及的基本概念 算法的概念、描述方法以及评价标准.
適用於多選一 可減少if 與 else配對混淆的錯誤.
多重條件選擇敘述
本教學投影片係屬教科書著作之延伸,亦受著作權法之保護。
Chapter 2 Entity-Relationship Model
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
C語言程式設計 老師:謝孟諺 助教:楊斯竣.
本节内容 指针类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
13-1 電腦可以協助解決哪些問題 13-2 電腦解題簡介 13-3 電腦解題規劃-演算法 13-4 認識資料結構
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
Presentation transcript:

第 3 章 堆疊與佇列

目次 3.1 堆疊和佇列基本觀念 3.2 堆疊的加入與刪除 3.3 佇列的加入與刪除 3.4 其它形式的佇列 3.5 多個堆疊和多個佇列 3.1 堆疊和佇列基本觀念 3.2 堆疊的加入與刪除 3.3 佇列的加入與刪除 3.4 其它形式的佇列 3.5 多個堆疊和多個佇列 3.6 堆疊與佇列的應用 3.7 如何計算後序表示式 3.8 動動腦時間 3.9 練習題解答

3.1 堆疊和佇列基本觀念 堆疊(Stack) 加入(push)與刪除(pop)於同一端 後進先出(LIFO) 例子:堆積木、蓋房子

3.1 堆疊和佇列基本觀念(con.t) 佇列(Queue) 加入與刪除於不同端(front & rear) 先進先出(FIFO) 例子:排隊買票、坐公車

3.2 堆疊的加入與刪除 3.2.1 堆疊加入函數(top的初始值為-1) 3.2 堆疊的加入與刪除 3.2.1 堆疊加入函數(top的初始值為-1) void push_func(int stack[], int MAX, int top) { if (top >= MAX-1) /* 當堆疊已滿,則顯示錯誤 */ printf("Stack is full !"); else { top++; printf( “\n\n Please enter item to insert: "); scanf( "%d", &stack[top]); }

3.2 堆疊的加入與刪除(con.t) 3.2.2 堆疊刪除函數 void pop_func(int stack[], int top) { if (top < 0) /* 當堆疊沒有資料存在,則顯示錯誤 */ printf(“\n\n No item, stack is empty !\n"); else { printf("\n\n Item %d deleted\n", stack[top]); top --; }

3.3 佇列的加入與刪除 3.3.1 佇列加入函數(front、rear的初始值分別為0、-1) 3.3 佇列的加入與刪除 3.3.1 佇列加入函數(front、rear的初始值分別為0、-1) void enqueue_func(int q[], int MAX, int rear) { if (rear >= MAX-1) /* 當佇列已滿,則顯示錯誤 */ printf("\n\nQueue is full !\n"); else { rear++; printf("\n\n Please enter item to insert: "); scanf("%d",&q[rear]); }

3.3 佇列的加入與刪除(con.t) 3.3.2 佇列刪除函數 void dequeue_func(int q[], int front, int rear) { if (front > rear) /* 當資料沒有資料存在,則顯示錯誤 */ printf("\n\n No item, queue is empty !\n"); else { printf("\n\n Item %d deleted\n", q[front]); front++; }

3.3 佇列的加入與刪除(con.t) 問題 環狀佇列 佇列前端還有空位,但要加入元素卻發現此佇列已滿 圖3-2 環狀佇列 1 2 3 4 1 2 3 4 5 6 7 8 N-1 N-2 圖3-2 環狀佇列

3.3 佇列的加入與刪除(con.t) 3.3.3 環狀佇列加入函數(front、rear的初始值均為MAX-1) { void enqueue_func(int cq[], int MAX, int front, int rear) { rear = (rear + 1) % MAX; if (front == rear) { if (rear == 0) rear = MAX–1 ; /* 退回原位 */ else rear = rear–1 ; /* 退回原位 */ printf("\n\nQueue is full!\n"); } else { printf("\n\n Please enter item to insert: "); scanf("%d",&cq[rear]);

3.3 佇列的加入與刪除(con.t) 3.3.4 環狀佇列刪除函數 void dequeue_func(int cq[], int MAX, int front, int rear) { if (front == rear) printf("\n\n Queue is empty !\n"); else { front = (front + 1) % MAX; printf("\n\n Item %d deleted\n", cq[front]); }

3.4 其它形式的佇列 雙向佇列(deque) 優先權佇列(priority queue) Double-ended queue 3.4 其它形式的佇列 雙向佇列(deque) Double-ended queue 佇列的兩端皆可加入和刪除 Ex:循序輸入五筆資料(1、2、3、4、5) 優先權佇列(priority queue) 每筆資料是依照優先權的高低放在佇列的適當位置 優先權高,所在的位置愈前面(愈快被執行) Ex:Heap

3.5 多個堆疊與多個佇列 與單一堆疊和佇列的觀念大致相同 多個堆疊的加入、刪除也是在同一端 多個佇列的加入是在後端、刪除是在前端 3.5 多個堆疊與多個佇列 與單一堆疊和佇列的觀念大致相同 多個堆疊的加入、刪除也是在同一端 多個佇列的加入是在後端、刪除是在前端 Ex:公司將硬碟空間分割成多個部份給員工來使用 多個佇列的形狀圖 多個堆疊的形狀圖

3.5 多個堆疊與多個佇列(con.t) 3.5.1 多個堆疊加入函數 (課本圖3.3) void push_func (int MS[ ], int t[ ], int b[ ], int i ) { if (t[i-1] == b[i]) printf(“stack is full !!!”); else MS[++t[i-1]] = x; }

3.5 多個堆疊與多個佇列(con.t) 3.5.2 多個堆疊刪除函數 { if (t[i-1] == b[i-1]){ void pop_func (int MS[ ], int t[ ], int b[ ], int i, int x) { if (t[i-1] == b[i-1]){ printf(“stack is empty !!”); return 0; } else{ x = MS[t[i-1]--] ; print(“%d is deleted !!!”, x);

3.5 多個堆疊與多個佇列(con.t) 3.5.3 多個佇列加入函數 (課本圖3.4) void enqueue_func (int MQ[ ], int f[ ], int r[ ], int i, int x) { if (r[i-1] == f[i]) printf(“queue is full !!!”); else MQ[++r[i-1]] = x; }

3.5 多個堆疊與多個佇列(con.t) 3.5.4 多個堆疊刪除函數 { if (r[i-1] == f[i-1]){ void dequeue_func (int MQ[ ], int f[ ], int r[ ], int i, int x) { if (r[i-1] == f[i-1]){ printf(“queue is empty !!”); return 0; } else{ x = MQ[f[i-1]++] ; print(“%d is deleted !!!”, x);

3.6 堆疊與佇列的應用 堆疊的應用 佇列的應用 副程式的呼叫 (subroutine calls) 中序表示式 → 後序表示式 3.6 堆疊與佇列的應用 堆疊的應用 副程式的呼叫 (subroutine calls) 中序表示式 → 後序表示式 佇列的應用 作業系統的工作安排(job scheduling)

3.6 堆疊與佇列的應用(con.t) 中序表示式 後序表示式 「運算子」(operator)置於「運算元」(operand)的中間 Ex:A*B / C 後序表示式 「運算子」置於「運算元」的後面 Ex:AB * C /

3.6 堆疊與佇列的應用(con.t) 一般運算子的運算優先順序如下: 運算子 優先順序(數字愈大,優先順序愈高) * , / , % 5 運算子 優先順序(數字愈大,優先順序愈高) * , / , % 5 + (加), - (減) 4 <, <= , > , >= 3 && 2 || 1

3.6 堆疊與佇列的應用(con.t) 運用堆疊的觀念 符號 in-stack priority in-coming priority ) – – * , / , % 2 2 + (加), - (減) 1 1 ( 0 3

3.6 堆疊與佇列的應用(con.t) void infix_to_postfix(char infix_q[], int rear) { int top = 0, ctr; char stack_t[MAX]; /* 用以儲存還不必輸出的運算子 */ stack_t[top] = '#'; /* 於堆疊最底下加入#為結束符號 */ for(ctr = 0; ctr <= rear; ctr++) { switch(infix_q[ctr]) { /* 輸入為),則內輸出堆疊內運算子,直到堆疊內為( */ case ')': while(stack_t[top] != '(') printf("%c", stack_t[top--]); top--; break; /* 輸入為#,則將堆疊內還未輸出的運算子輸出 */ case '#': while(stack_t[top] != '#')

3.6 堆疊與佇列的應用(con.t) /* 輸入為運算子,若小於TOP在堆疊中所指運算子,則將堆疊所指運算子輸 case '(': case '^': case '*': case '/': case '+': case '-': while(compare(stack_t[top], infix_q[ctr])) printf("%c", stack_t[top--]); stack_t[++top] = infix_q[ctr]; break; /* 輸入為運算元,則直接輸出 */ default : printf("%c", infix_q[ctr]); }

3.6 堆疊與佇列的應用(con.t) /* 比較兩運算子優先權,若輸入運算子小於堆疊中運算子,則傳值為1,否則為0 */ int compare(char stack_o, char infix_o) { int index_s = 0, index_i = 0; while(stack_priority[index_s] != stack_o) index_s++; while(infix_priority[index_i] != infix_o) index_i++; return index_s/2 >= index_i/2 ? 1 : 0; }

3.7 如何計算後序表示式 步驟 1:先將後序表示式以一字串表示 步驟 2:每次取出一個token,若 3.7 如何計算後序表示式 步驟 1:先將後序表示式以一字串表示 步驟 2:每次取出一個token,若 token為運算元,則將它push至堆疊中 token為運算子,則從堆疊中pop出二個運算元,並做適當的運算 token為’0’,則跳到步驟四 步驟 3:將步驟2的結果再push至堆疊,並繼續執行 步驟2。 步驟 4:彈出堆疊的資料,此資料即為後序表示法計 算的結果