Chapter 3 堆疊與佇列 ( Stacks and Queues ).

Slides:



Advertisements
Similar presentations
While 迴圈 - 不知重複執行次數
Advertisements

第一單元 建立java 程式.
計算機程式語言實習課.
動畫與遊戲設計 Data structure and artificial intelligent
第 5 章 流程控制 (一): 條件分支.
Chapter 5 遞迴 資料結構導論 - C語言實作.
Chapter 5 迴圈.
第三章 堆疊與佇列的基本應用 3-1 簡介堆疊(Stack) 3-2 迷宮問題研究 3-3 佇列(queue)的介紹
Linked List Operations
第6章 佇列(Queues) 6-1 佇列的基礎 6-2 佇列的表示法 6-3 環狀佇列 6-4 雙佇列.
單向鏈結串列 Singly Linked Lists.
資料結構 第3章 鏈結串列.
第 3 章 堆疊與佇列.
佇列 (Queue).
資料結構設計與C++程式應用 Fundamentals of Data Structures and Their Applications Using C++ 第3章 佇列 資料結構設計與C++程式應用.
Chapter 3 堆疊與佇列 3.1 堆疊和佇列基本觀念 3.2 堆疊的加入與刪除 3.3 佇列的加入與刪除 3.4 其他型式的佇列
Chap 3 堆疊與佇列 Stack and Queue.
2-3 基本數位邏輯處理※.
(Circular Linked Lists)
堆疊 Stack chapter 4 德明科技大學資訊科技系.
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
Introduction to the C Programming Language
第三章 栈与队列 £3.1 栈 £3.3 队列 £3.2 栈的应用举例 £3.1.1 栈的定义 £3.1.2 栈的顺序存储结构
第3章 栈和队列(一).
第三章 栈和队列.
資料結構與C++程式設計進階 堆疊與佇列(Stack & Queue) 講師:林業峻 CSIE, NTU 6/ 21, 2010.
Chapter 4 堆疊和佇列 資料結構導論 - C語言實作.
4.1 單向鏈結串列 4.2 堆疊的加入與刪除 4.3 佇列的加入與刪除 4.4 其他型式的佇列
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
Chap3 Linked List 鏈結串列.
第三章 栈和队列.
計數式重複敘述 for 迴圈 P
資料結構 第4章 堆疊.
第一單元 建立java 程式.
分支宣告與程式設計 黃聰明 國立臺灣師範大學數學系
Ch20. 計算器 (Mac 版本).
資料結構 優點 缺點 1 陣列 (Array) 沒有額外變量 (例head, next,...) 運作/操作較簡單 更新資料時,若要保持順序,需要移動較大量資料 靜態結構Static (宣告時已決定了陣列元素多少,不能在程式執行期間增減元素) 2 隊列Queue (FIFO) 容易更新 加入enqueue:
自我參考結構 (self-reference – 1)
Chapter 3 堆疊與佇列 3.1 堆疊和佇列基本觀念 3.2 堆疊的機入與刪除 3.3 佇列的加入與刪除 3.4 環狀佇列
软件测试 (四)静态测试与动态测试.
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
程式結構&語法.
Linked Lists Prof. Michael Tsai 2013/3/12.
緩衝區溢位攻擊 學生:A 羅以豪 教授:梁明章
挑戰C++程式語言 ──第8章 進一步談字元與字串
Chap2 Stack & Queue.
第四章 栈和队列 栈 ( Stack ) 队列 ( Queue ) 优先队列 (Priority Queue) 小结.
C qsort.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
Chap2 Stack & Queue.
第 六 讲 栈和队列(一).
流程控制:Switch-Case 94學年度第一學期‧資訊教育 東海大學物理系.
陣列與結構.
第4章 堆疊和佇列 資料結構設計與C++程式應用
選擇性結構 if-else… switch-case 重複性結構 while… do-while… for…
第1章 数据结构基础概论 本章主要介绍以下内容 数据结构研究的主要内容 数据结构中涉及的基本概念 算法的概念、描述方法以及评价标准.
程式設計--Quick Sort 通訊一甲 B 楊穎穆.
期末報告第一題 通訊四甲 B 湯智瑋.
資料結構與C++程式設計進階 期末考 講師:林業峻 CSIE, NTU 7/ 15, 2010.
计算机问题求解 – 论题 基本的数据结构 2018年05月09日.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
String類別 在C語言中提供兩種支援字串的方式 可以使用傳統以null結尾的字元陣列 使用string類別
Array(陣列) Anny
10303: How Many Trees? ★★☆☆☆ 題組:Contest Archive with Online Judge
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
C語言程式設計 老師:謝孟諺 助教:楊斯竣.
微 處 理 機 專 題 – 8051 C語言程式設計 主題:階乘計算
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
InputStreamReader Console Scanner
Presentation transcript:

Chapter 3 堆疊與佇列 ( Stacks and Queues )

學習目標 在學習本章之後,讀者們要能夠瞭解: 1.堆疊與佇列的資料型態。 2.堆疊與佇列的演算法與資料結構。 3.在電腦程式中如何模擬堆疊與佇列。

堆疊與佇列

什麼是堆疊 這樣的方式也叫做先進後出 最先進入的最後出來,最後進去的最先出來。

什麼是佇列 也稱為先進先出。

堆疊與佇列的資料結構 堆疊是A , B , C進;C , B , A出,稱為先進後出。 佇列是A , B , C進;A , B , C出,稱為先進先出。

堆疊的應用 副程式的呼叫   處理遞迴式呼叫叫   算術式之轉換   二元樹的追蹤   中斷處理 (Intrrupt Handing)   迷宮問題  

佇列的應用 作業系統的工作排序 用於印表機或作業系統的Spooling 計算機的模擬(Simulation) 資料通訊

堆疊(Stack)

定義 一群同質元素的組合,即有序串列(Ordered List) 所有的加入(Insertion;push)和刪除(Deletion;pop)動作均在頂端(Top)進行 具有後進先出(Last-In-First-Out;簡稱LIFO)的特性

特性 後進先出(LIFO, Last In First Out)的有序數列 加入與刪除資料只在頂端(top)進行 加入資料稱為push, 刪除資料資料稱為pop

字串特性的判別 假設我們想寫一個程式,以任意的字串為輸入,然後判定該字串是否順著念和逆著念結果都一樣。如何用堆疊來判別字串是否具有上述的特性,先將字串推進堆疊中,下次從堆疊中逐字推出時會得到倒著念的字串;若是從堆疊中逐字推出再推進另一個堆疊中,然後從堆疊再逐字推出會得到順著念的字串。只要將兩個字串逐字比對,就可判別原字串是否順著念和倒著念都能得到同樣的結果。由電腦來執行這一連串的操作,速度會很快。

用堆疊來判別字串的特性

加法器 加法器可以求取兩個整數相加之後的結果,當然,在程式語言中只要用「+」的運算元就能得到同樣的效果;不過,在這個例子裡頭,我們要用軟體來模擬硬體加法器 (Adder) 的操作。輸入的兩個整數各放到一個堆疊中,然後逐位數地推出相加,由於有進位的問題,所以一旦有進位,加法器會把1推入堆疊S中,下次逐位數相加時,必須再加上進位的值,也就是由堆疊S推出來的數值。因此,SUM=Digit1+Digit2+進位1,若有進位,則令進位2=1。

加法器的原理

堆疊的基本運作 CREATE(S):建立空的堆疊。 PUSH(data, S):將資料加入堆疊的頂端。 POP(S):傳回堆疊頂端的資料,並將該筆資料自堆疊中刪除。 TOP(S):傳回堆疊頂端的資料,但不將該筆資料自堆疊中刪除。 EMPTY(S):若堆疊內已無任何資料,就傳回真值(True),否則為假值(False)。 FULL(S):若堆疊內已滿,就傳回真值(True),否則為假值(False)。

構造與相關的操作

堆疊的表示法 陣列 鏈結串列 基本運作必須具備下列功能: 產生堆疊結構:宣告一個陣列或鏈結串列結構。 將資料放入堆疊(Push動作):更改Top指標後,將資料存入堆疊;使用陣列時,必須判斷堆疊是否已滿。 刪除資料(Pop動作):若堆疊不是空的,將頂端資料取出,並更改Top指標。 判斷堆疊是否滿溢:使用陣列時,判斷Top指標是否等於N-1。 判斷堆疊是否是空的:Top值小於0或指向NULL。

鏈結串列製作堆疊

陣列模擬堆疊 以一維陣列S(1 To n)表示一個堆疊 top表示最上層的索引值 當搬入時top+1 當搬出時top-1 如果是負的表示這一個堆疊空無一物

陣列圖解 建立一個陣列,top表示最上層的索引值,我們有必要知道最上層的值為何,方便於堆入(push)資料或是彈出(pop)資料: 當搬入時top+1,當搬出時top-1;如果是負的表示這一個堆疊空無一物。 索引 1 2 3 值 註標(top = -1) Ex:輸入(push)ABC,輸出(pop)CBA 放入A、B、C 輸入A 索引 1 2 3 值 A 註標(top = -1) top = 0

輸入B 索引 1 2 3 值 A B 註標 top = 1 輸入C 索引 1 2 3 值 A B C 註標 top = 2

接著輸出C、B、A 輸出C 索引 1 2 3 值 A B 註標 top = 1 輸出B 索引 1 2 3 值 A 註標 top = 0

輸出A 索引 1 2 3 值 註標(top= -1) top為負,表示空無一物。

堆疊的演算法與程式

堆疊的陣列宣告 C語言程式碼如下: #define N 100 /* N 為堆疊大小 */ int stack[N]; /* 陣列stack當作堆疊 */ int top= -1; /* top表頂端之位置 */

push操作 檢查堆疊是否已滿,若已滿則加入失敗。 否則將堆疊頂端之指標top 值加1 ,即top 上移一格,新資料在加入目前top所指之陣列元素位置中。

演算法:虛擬碼 Procedure push(int stack[ ] , int element) { index top; if (top >=stack的範圍)  顯示堆疊已滿的錯誤訊息; else top = top+1; stack[ top ]=element; }

C語言:程式碼(一) void push (int Stack[ ] , int MaxSize , int top , int item ) { if ( top >=MaxSize-1 ) printf(“堆疊滿了…”) ; else Stack [+ +top ]=item ; }

C語言:程式碼(二) void push(int d) /*加入資料於堆疊內*/ { if(top == N-1) printf("堆疊滿了\n"); /* 注意堆疊大小 */ exit(1); /* 加入失敗,執行結束 */ } /* end if */ stack[++top]=d; }

pop操作 檢查堆疊是否空了,若是空堆疊則刪除失敗。 否則傳回頂端資料後將top 值減1 ,即top 向下移一格。

演算法:虛擬碼 Procedure pop(int stack[ ]) { index top; if (top 己到堆疊底端)  顯示錯誤訊息; else x=堆疊的頂端元素; top = top-1; 傳回 x; }

C語言:程式碼(一) void pop (int Stack[ ] , int top ) { if ( top < 0 ) printf(“堆疊空了,無任何資料可刪…”) ; else print(“%d 從堆疊被刪除了” , Stack [ top ] ) ; x = stack [top - - ]; }

C語言:程式碼(二) int pop() { if(top == -1) /* 注意空堆疊情形*/ { printf("堆疊空了\n"); exit(1); /*刪除失敗,執行結束 */ } return(stack[top--]);

範例 寫一個具有push壓(input),彈(pop)的程式: #include <stdio.h> struct node                 // 宣告一個結構 { int number; struct node *next; }; void showmain(); struct node *push(struct node *); struct node *pop(struct node *);

void main() { struct node *top = NULL; do{ showmain();           // 列印表單 switch (getche()) { case '1': top = push(top);            // 壓入 break; case '2': top = pop(top);            // 彈出 case '3': exit(0); default: printf("\nIt is wrong,pleace input again\n"); } }while (1);

void showmain() { printf("<1>push a value\n"); printf("<2>pop a value\n"); printf("<3>exit\n"); } struct node *push(struct node *top) { struct node *New; New = (struct node *)malloc(sizeof(struct node));        // 新節點 printf("pleace input a number"); scanf("%d",&(New->number));                                   // 輸入值 New->next = top;                                                         // 將新節點的next指向top top = New;                                         // 再將top指向New return (top);                                       // 傳回top }

struct node *pop(struct node *top) { struct node *freenode; if (top != NULL)                      // 當top為NULL表示沒有值,不可彈出 { printf("\nThe pop number is %d\n",top->number); freenode = top;                  // 紀錄需要釋放的節點 top = top ->next;               // top彈出之後top要往回一格 free (freenode);                 // 釋放記憶體 return (top);                      // 回傳top } else { printf("\nNo Node\n"); return (NULL); }