資料結構與C++程式設計進階 堆疊與佇列(Stack & Queue) 講師:林業峻 CSIE, NTU 6/ 21, 2010.

Slides:



Advertisements
Similar presentations
颐高集团项目中心 海亮地产开发模式研究报告. 目 录 目 录 第四部分:海亮地产高周转模式执行 第二部分:海亮地产高周转模式原因 第三部分:海亮地产高周转模式内涵 第一部分:海亮地产企业背景 第五部分:海亮地产高周转支撑体系.
Advertisements

常見之視力保健錯誤觀念 林隆光醫師 主講. 正 確 觀 念 : E 字視力表是英、美國家用的 ,他們一向不流行世界其他國 共同的「公制」。雖然學校一 般採用 E 字表,但 C 字表才是所 謂「萬國式」視力表。 錯誤觀念一:測視力,祗能採用 E 字檢查表 才正確。
動畫與遊戲設計 Data structure and artificial intelligent
系统简介 理财顾问 业务 是基于通信平台的技术优势,整合《理财周刊》、第一理财网、乾隆集团等合作伙伴提供的理财产品内容和权威的理财专家资源,以集中式呼叫中心为主的服务方式,让普通百姓可以享受到快捷、全面、专业、权威的资讯及投资理财的服务平台。
鹽寮灣是世界最早工業區遺址.
数据结构概论 第2章 线性表 董黎刚 浙江工商大学信电学院
班級:行流四甲 組員:497D0004何筱瑩 497D0016鄧宜欣 497D0044呂亭儀 497D0056黃 琪 497D0063賴依淩
宦官那些事儿 宦官那些事儿 主讲:小学部李永善 主讲:小学部李永善.
第四章 借贷记账法 在制造业中的应用.
电视教育课 【5】 小学生行为习惯养成教育.
网络信息资源的开发与设计 主讲教师 罗双兰 广西师范大学教育科学学院.
第二章 线性表.
資料結構與C++程式設計進階 資料結構概論 講師:林業峻 CSIE, NTU 6/ 7, 2010.
第三章 堆疊與佇列的基本應用 3-1 簡介堆疊(Stack) 3-2 迷宮問題研究 3-3 佇列(queue)的介紹
Linked List Operations
第3章 栈和队列 3.1 栈 3.2 队列 3.3 应用.
單向鏈結串列 Singly Linked Lists.
第6章 佇列(Queues) 6-1 佇列的基礎 6-2 佇列的表示法 6-3 環狀佇列 6-4 雙佇列.
佇列 (Queue).
佇列與推疊 (Queue and Stack)
資料結構簡介.
4.4 佇列 特徵: c b a c b d c b 新增 d 刪除 入口 入口 入口 尾端(rear) 尾端(rear) 尾端(rear)
資料結構 第5章 佇列.
講師:郭育倫 第3章 基本資料結構 講師:郭育倫
Chap 3 堆疊與佇列 Stack and Queue.
第8章 列舉器與集合 注意: 本投影片僅供本書上課教師使用,非經同意請勿上網轉載或供拷貝.
第十五章 Linked List, Stack and Queue
Ch.3 栈和队列 黄刘生 中国科学技术大学计算机系 国家高性能计算中心(合肥)
4 堆疊與佇列 4.1 前言 四種基本的資料結構 (可儲存資料的容器) 陣列 (Array)、串列(List): 最基本
线性表小结 元素之间的线性关系 顺序表 顺序表:元素相邻存储 单链表:后继指针链接 一维数组 给定下标随机存取
cn/~dongeliu/dsa.html 刘 东 信息学院6系 中国科学技术大学
第3章 栈和队列(二) 1/.
第2章 线性表 线性表抽象数据类型 顺序表 主要知识点 单链表 循环单链表 循环双向链表 静态链表 设计举例.
第十章 C高级程序应用—链表* 10.1链表的基本概念 10.2单向链表 10.3双向链表 10.4应用举例.
堆疊 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.1 栈 3.2 栈的应用举例 3.3 栈与递归的实现 3.4 队列.
第3章 栈和队列(一).
第三章 栈和队列.
数据结构 Data Structure 中南大学 主讲人:王国军,郑瑾 中南大学信息院计科系
第一章 绪论.
五、链 表 1、单链表 2、双向链表 3、链表应用.
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
佇列(queue) Lai Ah Fur.
第三章 栈和队列.
資料結構 第4章 堆疊.
严蔚敏、吴伟民编著 清华大学出版社 学习网站:
第四章 堆疊與佇列 課前指引 資料結構學科中,堆疊(Stack)與佇列是兩種相當典型的抽象資料型態,也是一種有特定進出規則的線性串列應用,主要特性是限制了資料插入與刪除的位置和方法。本章中將會介紹堆疊與佇列的概念與特性,及在計算機領域的各種相關應用。
感謝同學們在加分題建議. 我會好好研讀+反省~
Chapter6 队列(Queues) The Abstract Data Type
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
資料結構 優點 缺點 1 陣列 (Array) 沒有額外變量 (例head, next,...) 運作/操作較簡單 更新資料時,若要保持順序,需要移動較大量資料 靜態結構Static (宣告時已決定了陣列元素多少,不能在程式執行期間增減元素) 2 隊列Queue (FIFO) 容易更新 加入enqueue:
自我參考結構 (self-reference – 1)
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
第五章 介面/集合/泛型 注意: 本投影片僅供本書上課教師使用,非經同意請勿上網轉載或供拷貝.
資料結構與C++程式設計進階 排序與搜尋 講師:林業峻 CSIE, NTU 6/ 14, 2010.
資料結構與C++程式設計進階 實作練習 講師:林業峻 CSIE, NTU 6/ 24, 2010.
Linked Lists Prof. Michael Tsai 2013/3/12.
Chap2 Stack & Queue.
第四章 栈和队列 栈 ( Stack ) 队列 ( Queue ) 优先队列 (Priority Queue) 小结.
Lucene 算法介绍 IR-Lab 胡晓光.
第 六 讲 栈和队列(一).
1. 志明打算就客戶服務開發一個語音互動(IVR)系統, 顧客可透過電話鍵盤與系統進行互動。
Chapter 2 Entity-Relationship Model
資料結構與C++程式設計進階 C++與資料結構 講師:林業峻 CSIE, NTU 7/ 5, 2010.
第六章 直接成本法.
13-1 電腦可以協助解決哪些問題 13-2 電腦解題簡介 13-3 電腦解題規劃-演算法 13-4 認識資料結構
Presentation transcript:

資料結構與C++程式設計進階 堆疊與佇列(Stack & Queue) 講師:林業峻 CSIE, NTU 6/ 21, 2010

堆疊與佇列 堆疊(Stack) 佇列(Queue) 加入(push)與刪除(pop)於同一端 用途:後進先出(LIFO)之資料特性 例子:遞迴、走迷宮、深度優先搜尋 佇列(Queue) 加入(enqueue)與刪除(dequeue)於不同端(front & rear) 用途:先進先出(FIFO)之資料特性 應用:排隊問題、資源使用順序控制

大綱 堆疊 (Stack) 陣列表示法 串列表示法 應用:走迷宮程式 佇列 (Queue) 應用:優先佇列

堆疊結構表示法(陣列) (stack_array.c) 堆疊表示法 加入堆疊 取出堆疊 top: 2 stack 資料1 資料2 資料3 MAX_SIZE: 6 [0] [1] [2] [3] [4] [5] 資料4 top: 3 stack 資料1 資料2 資料3 資料4 MAX_SIZE: 6 [0] [1] [2] [3] [4] [5] top: 2 stack 資料1 資料2 資料3 MAX_SIZE: 6 [0] [1] [2] [3] [4] [5] 資料4

堆疊結構表示法(陣列) 加入堆疊 int push(node data) { if(top == MAX_SIZE-1) //判斷堆疊是否已滿 return 0; //回傳存入失敗!(堆疊已滿) } top++; //移動堆疊結尾位置 stack[top] = data; //存入資料 return 1; //回傳存入成功!

堆疊結構表示法(陣列) 取出堆疊 int pop(node *data) { if(top == -1) //判斷堆疊是否為空的 return 0; //回傳取出失敗!(堆疊為空) } *data = stack[top]; //取出資料 stack[top].data = 0; //清除內容 top--; //移動堆疊結尾位置 return 1; //回傳存入成功!

堆疊結構表示法(鏈結串列) (stack_list.c) 堆疊表示法 加入堆疊 取出堆疊 stack 資料3 資料2 資料1 NULL stack 資料4 資料3 資料2 資料1 NULL stack 資料4 資料3 資料2 資料1 NULL

堆疊結構表示法(鏈結串列) 加入堆疊 void push(node data) { node *new_node; new_node = (node *)malloc(sizeof(node)); *new_node = data; //堆疊資料存入 new_node->next = stack; //取得新的堆疊起點 stack = new_node; //插入 }

堆疊結構表示法(鏈結串列) 取出堆疊 int pop(node *data) { node *top; if( stack != NULL ) //判斷堆疊是否為空的 top = stack; stack = stack->next; *data = *top; //取得資料 free(top); return 1; //回傳取得成功! } else return 0; //回傳取得失敗!(堆疊為空)

走迷宮問題 (stack_maze.c) 使用堆疊結構實作走迷宮問題 … 走法: 每次都把目前位置存到堆疊, 然後走下一步 下一步順序: 上,下,左,右 無路可走: 從堆疊中取出上一位置, 看看有沒路走 堆疊大小: ? 出口 (1,1) 1 1 1 1 1 1 1 1 1 1 走錯: 座標pop出去 1 1 1 1 (1,1) 1 1 1 1 1 1 1 1 1 1 1 1 … 1 1 1 1 1 1 1 1 1 (7,4) 走一步: 座標push入堆疊 入口 (8,5) (7,5) 1 1 1 1 1 1 1 1 1 1 (8,5)

走迷宮問題 走迷宮結果 1 1 1 1 1 1 1 1 1 1 1 2 1 3 1 3 3 3 3 1 1 2 1 3 1 3 1 1 3 1 1 2 1 3 1 1 1 3 3 1 1 2 1 2 2 2 2 2 1 1 1 2 2 2 1 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1

練習 將上一迷宮問題範例解答之路徑座標印出

大綱 堆疊 (Stack) 陣列表示法 串列表示法 應用:走迷宮程式 佇列 (Queue) 應用:優先佇列

佇列結構表示法(陣列) (queue_array.c) 佇列表示法 加入佇列 取出佇列 front: -1 rear: 2 MAX_SIZE: 6 size: 3 queue 資料1 資料2 資料3 [0] [1] [2] [3] [4] [5] 資料4 front: -1 rear: 3 MAX_SIZE: 6 size: 4 queue 資料1 資料2 資料3 資料4 [0] [1] [2] [3] [4] [5] front: 0 rear: 3 MAX_SIZE: 6 size: 3 queue 資料2 資料3 資料4 [0] [1] [2] [3] [4] [5] 資料1

佇列結構情況判斷(陣列) 佇列為空 佇列已滿 front: 3 rear: 3 MAX_SIZE: 6 size: 0 queue [0] [1] [2] [3] [4] [5] front: 2 rear: 2 MAX_SIZE: 6 size: 6 queue 資料4 資料5 資料6 資料1 資料2 資料3 [0] [1] [2] [3] [4] [5]

佇列結構表示法(陣列) 加入佇列 int enqueue(node data) { if( size == MAX_SIZE ) // 檢查佇列是否已滿 return 0; // 存入佇列失敗!(佇列已滿) rear++; // 移動佇列尾的位置 size++; // 佇列容量+1 if(rear==MAX_SIZE) // 檢查是否超過界限 rear = 0; // 重頭開始 queue[rear] = data; // 存入佇列 return 1; // 存入佇列成功! }

佇列結構表示法(陣列) 取出佇列 int dequeue(node *data) { if(size == 0) // 檢查佇列是否是空的 return 0; // 取出佇列失敗!(佇列為空) front++; // 移動佇列頭的位置 size--; // 佇列容量-1 if(front==MAX_SIZE) // 檢查是否超過界限 front = 0; // 重頭開始 *data = queue[front]; // 取出佇列資料 queue[front].data = 0; // 清除內容 return 1; // 取出佇列成功! }

佇列結構表示法(鏈結串列) (queue_list.c) 佇列表示法 加入佇列 取出佇列 queue 資料1 資料2 資料3 NULL rear front queue 資料1 資料2 資料3 資料4 NULL rear front queue 資料1 資料2 資料3 資料4 NULL rear front

佇列結構表示法(串列) 加入佇列 void enqueue(node data) { node *new_node; new_node = (node *)malloc(sizeof(node)); *new_node = data; //儲存新節點內容 new_node->next = NULL; if(front==NULL) //插頭 front = new_node; else //插尾 rear->next = new_node; rear = new_node; //取得佇列新結尾 }

佇列結構表示法(串列) 取出佇列 //取出節點 int dequeue(node *data) { node *top; if(front != NULL) top = front; front = front->next; //取得佇列新起點 *data = *top; //儲存節點內容 free(top); //刪除頭 return 1; //回傳取得成功! } else return 0; //回傳取得失敗!(佇列為空)

練習 改寫鏈結串列佇列程式(queue_list.c),設定練節串 列堆疊結構之節點最大值為6

優先佇列 優先佇列 (Priority Queues) (queue_priority.c) 資料排入佇列順序不一定是先到先贏, 而是根據優先權來插入 佇列之中 例如資料有兩種優先等級(A,B級), 如果有個A級資料需要插入 佇列, 應該將它插到目前佇列中A級資料之後, 與所有B級資料 之前 queue A1 A2 B1 B2 NULL front rear_a rear_b A級會員 B級會員

加入佇列 目前有同級會員 B2 new_node NULL queue A1 A2 B1 NULL front rear_a rear_b

加入佇列 目前無同級會員 前有更高級會員 前無更高級會員 rear_b B級會員 B1 new_node NULL queue A1 A2 front rear_a A級會員 rear_a A1 new_node A級會員 B1 B2 queue NULL NULL front rear_b B級會員

取出佇列 目前有多個同級會員 目前只有一個同級會員 queue A1 A2 B1 B2 NULL front rear_a rear_b