Upload
others
View
7
Download
0
Embed Size (px)
Citation preview
壹、課程說明
單元名稱 C語言:資料結構
單元摘要
本教案主要目的在讓學生瞭解並認識 Queues、Stacks、Linked lists、Trees 與 Sets,其中 Trees 和 Sets 為選授教材,教師可依照授課時間及學生程度 自行決定是否教授,若不教授,教師可將時間分配至 Queues 等資料結構 中,讓學生多練習並熟悉其應用。
依據課綱的精神,本單元主要在讓學生瞭解各種資料結構的用途及使
用方法,至於各資料結構的實作細節並不是授課的重點,是以本教案在設
計時,均不揭示其實作方法,而著重於性質、應用方式以及使用時機的介
紹。教案在此提供許多的範例及性質整理,希望教師在教學時,能將資料
結構實作的細節當作黑箱處理。這種作法其實是非常合理的,因為現在的
程式語言,除了語法本身外,均提供上述資料結構的函式庫,確切的瞭解
每種資料結構的優缺點及其使用方式,是非常有助於問題解決。
本教案在程式語言方面,可以採用 C 或者 C++。若採用 C++,建議直 接使用C++所提供的標準樣版函式庫 (Standard Template Library), 若使用C 語言,建議教師事先寫好各資料結構的函式,提供學生使用,有關這部分
各位教師可以自參考資源中所提供資訊及利用網路搜尋,稍加整理即可完
成。
設 計 者 張啟中教師 (國立大里高中)
學習目標 1. 瞭解各種資料結構的性質與應用時機。 2. 認識各種資料結構的使用方法。
課綱範圍
1.佇列 11佇列用途 12佇列使用方法
2.堆疊 21堆疊用途 22堆疊使用方法
3.鏈結串列 31鏈結串列用途 32鏈結串列使用方法
4.樹狀結構(※選授) 41樹狀結構用途 42樹狀結構使用方法
5.集合(※選授) 51集合用途 52集合使用方法
教學節數 1012 節
先備知識 1. 學生已修習過資訊科技概論。 2. 學生已學習並熟悉 C/C++ 語言基本語法。 3. 學生已能用 C/C++ 解決簡單的問題。
評量方法
1.上機測驗。 2.課堂問答。 3.練習解題情況。 4.分組報告
參考資源
[1] Data Structures, A Pseudocode Approach with C++. Richard F.Gilberg & Behrouz A. Forouzan. ISBN 053495216X
[2] Fundamentals of Data Structures in C++. Ellis Horowitz, Sartaj Sahni, & Dinesh Mehta. ISBN 0716782928
[3] http://imil.au.edu.tw/~hsichcl/DataStructureHandout.htm [4] http://www.cppreference.com [5] http://web.thu.edu.tw/~johnaxer [6] http://zh.wikipedia.org/zhtw, 台灣維基,搜尋條目:資料結構
貳、教學活動計畫
教學活動 時 間 說 明
認識佇列 (Queue)
佇列使用方式
10
40
一、認識佇列 (Queue) 教師利用「排隊買票」為例子,說明「排隊買票」
具有「先到先買」的特性。教師請同學舉出日常生活
中還有哪些事物,類似「排隊買票」,有著「先進先
出」的性質呢?
參考答案: 1. 工廠中的產品組合生產線。 2. 銀行的服務櫃臺。 3. 廠商促銷活動時,贈品採「先買先送,送完為止」
的策略。
備註:先抽號碼牌,也是排隊的一種方式。
教師總結以上討論:
在資訊領域中,我們利用資料結構「佇列」
(Queue)來模擬這樣的特性,所以,「佇列」這種資 料結構有「先進先出」的性質。因此,只要所面臨的
情境,有先進先出的特性,就非常適合利用佇列來解
決。
二、瞭解佇列的操作 1. 教師介紹佇列的基本操作 (1)建立一個佇列(Create) (2)放入一個元素(Enqueue) (3)取出一個元素(Dequeue) (4)讀取前端元素(Front) (5)取得目前元素的個數(Count)
front
2. 教師以程式示範佇列的基本操作程式碼後,請同學 練習以熟悉佇列。
備註: C語言:請教師預先利用 C語言寫好 Queue的操作函
式,供學生直接呼叫使用。 C++語言:教師可以直接使用標準函式庫中的 Queue
…
(第 1節結束) 佇列的應用
佇列練習
(第 2節結束) 認識堆疊 (Stack)
10
40
10
模版(template)。
三、佇列在資訊領域的應用
教師舉例說明佇列在資訊領域的應用,作為總
結。以下請參考: 1. 作業系統的程式工作排程。 2. 網路網頁伺服器對於客戶端的服務請求。 3. 作業系統對於鍵盤、滑鼠等事件的服務。
四、練習
教師揭示練習題目,並解釋題目意思後,請同學練
習。同學練習時,教師可視同學解題情況,適當提示
同學解題方向。
練習題目:
我們想要將一個數列資料分為以下四個群組,但是分
群後,數列原有數字間的次序關係不可以變動。
群組 1:= 30
範例: Input: 3, 22, 12, 6, 10, 34, 65, 29, 9, 30, 81, 4, 5, 19, 20, 57, 44, 99
Output: 群組 1:3 6 9 4 5 群組 2:12 10 19 群組 3:22 29 20 群組 4:34 65 30 81 57 44 99
解題要領:
建立四個 Queue,循序訪查數列各數字,分別放入所 屬 Queue中即可。
一、認識堆疊(Stack) 1. 教師於課前準備以下物品: (1)透明的量筒 1個 (需能放入塑膠球)。 (2)不同顏色的塑膠球若干個。
2.教師依序放入塑膠球,然後請同學觀察取出的順序 與放入的順序有何差異?教師請同學發表後,總
結:
堆疊的使用方式
(第 3節結束) 堆疊的應用
40
10
色球放入量筒的順序,與取出的順序
剛好相反,這種特性,我們稱做「先
進後出」。
3.教師再度示範:一堆書本堆疊後,在維持書本堆疊 不傾倒的狀況下,要取出其中一本書,就必須先把
上面的書一一移開後,才能順利取出,以此強調 「後
進先出」這種性質,並說明此性質在資訊領域中,
可用資料結構堆疊(Stack)表示。堆疊(Stack)是一種 後進先出的資料結構。
二、瞭解堆疊的基本操作 1. 教師介紹堆疊的基本操作 (1)建立一個堆疊(Create) (2)插入一個元素(Push) (3)取出一個元素(Pop) (4)讀取頂端元素(Top) (5)取得目前元素的個數(Count)
Top
2.教師以程式示範堆疊的基本操作後,請同學練習。
備註: C 語言:請教師預先利用 C 語言寫好 Stack 的操作函
式,供學生直接呼叫使用。 C++語言:教師可以直接使用標準函式庫中的 Stack
模版(template)。
三、堆疊在資訊領域的應用
教師舉例說明堆疊在資訊領域的應用,作為總
結。以下請參考: 1.程式語言執行時,用來記錄函式的返回位址。 2.應用軟體用來記錄使用者操作的步驟,以便容易回
…
(第 4節結束)
40
溯還原。 3.將中置的數學算式轉換為後置,或計算後置數學算 式的結果。
4.利用來實作演算法 backtracking
四、練習
教師揭示練習題目,並解釋題目意思後,請同學練
習。同學練習時,教師可視同學解題情況,適當提示
同學解題方向。
題目 1 一個左括弧,必有一個右括弧與之配對,且此配對的
組合左括弧須在右括弧前面。若給定一堆左右括弧,
試寫一個程式判斷左右括弧是否均能配對。
Input ()(()) (()) )()(
Output ()(()) Yes! (()) Yes! )()( No!
解題要領:
利用 Stack,遇到左括號,直接推入堆疊,遇到右括 號自堆疊取出一個左括號 1.若輸入為空,判斷堆疊是否為空,若為空則有配對, 否則反之。
2.若須自堆疊取出一個左括號,但此時堆疊卻為空, 則未能配對成功。
題目 2: 在練習本題時,教師宜先解釋何謂後置表示式。
後置表示式即運算子寫在所須運算元後的一種算術
表示法。此種表示式的優點是可以不用括弧幫助,即
可表示初運算子優先次序。
給定一個後置算術表示式,請計算出結果。 Input 9 5 + 2 *
Output 28
認 識 鏈 結 串 列 (Linked list)
50 解題要領: 利用 Stack,遇到數字直接推入堆疊,遇到運算子取 出兩個元素(數字)後計算,結果再推入堆疊,直至輸 入為空,此時堆疊頂端的元素即為計算結果。
一、認識鏈結串列(Linked list) 1. 認識串列(List) (1)教師介紹串列的定義 串列(List)是按照一定順序關係的資料組。 (注意:此處順序關係,與排序並不相同)
例如:
四季:春、夏、秋、冬
英文字母:A~Z 3n+1數列:10, 5, 16, 8, 4, 2, 1 由小排列到大的數列:12, 14, 26, 32
(2)教師請同學思考,串列資料應如何儲存在電腦中? 教師可提示學生:使用陣列可不可以?
2.教師請同學討論使用陣列來表示串列的優缺點。 教師可以使用例子,引導學生討論說明,例如:
(1)新增數字 20 (2)刪除數字 14
參考答案:
優點 (1)觀念簡單,容易使用。 (2)存取陣列元素,僅須常數時間。
缺點 (1)陣列宣告後,可使用空間便已決定,無法增減。 (2)刪除、插入元素,須花時間作資料搬移動作,維護
代價高昂。
教師總結說明使用陣列表示串列的優缺點後,向同學
介紹資料結構「鏈結串列」 。
(第 5節結束)
鏈結串列的使用方式
鏈結串列的應用
40
10
3.介紹鏈結串列的結構 鏈結串列是由一群節點組合而成。 (1)節點(node)
(指向下一個節點)
typedef struct node {
int value; node *next;
};
(2)鏈結串列
(3)教師展示鏈結串列執行以下操作,並請學生觀察比 較與之前陣列表示的不同:
(備註:僅須展示,不必詳細說明動作的每一步) a. 新增數字 20 b. 刪除數字 14
4.鏈結串列主要的特性 教師總結以上討論,總結如下: (1)使用空間可以依照實際需求增減,不會有閒置情況
或空間使用上限的限制。 (2)插入、刪除節點均在常數時間完成。 (3)尋找或提取節點的值,須循序尋找。 鏈結串列適合表示有序的資料組,且資料組常有增
加、刪除等維護動作的時候尤其適合,例如:資料庫
索引等。
二、鏈結串列的基本操作
教師以實際程式碼解說以下基本操作 (1)建立一個鏈結串列(Create)。 (2)插入一個節點(Insert)。 (3)刪除一個節點(Delete)。 (4)尋找一個節點(Search)
值 指標
Head 12 14
32 26
(第 6節結束) 鏈結串列的練習
(第 7節結束) 認識樹狀結構 (Trees)
50
50
備註: C語言: 請教師預先利用 C語言寫好 list 的操作函式,
供學生直接呼叫使用。 C++語言:教師可以直接使用標準函式庫中的 list 模
版(template)。
三、鏈結串列在資訊領域的應用 1. 可用來實作其他的資料結構,例如:Queue、Stack、
Tree等。 2. 可以用來表示圖形 (Graph) 3. 可以用來表示多項式。 4. 資料庫資料的索引建置。
四、練習
教師揭示練習題目,並解釋題目意思後,請同學練
習。同學練習時,教師可視同學解題情況,適當提示
同學解題方向。 (※教師可視時間,練習 13題。)
題目 1: 給定兩個多項式,試計算出此二多項式相加的結果。
Input 3 14 2 8 1 0 (代表 3x 14 + 2x 8 + 1) 8 14 3 10 10 6 (代表 8x 14 3x 10 + 10x 6 )
Output 11 14 3 10 2 8 10 6 1 0 (代表 11x 14 3x 10 + 2x 8 + 10x 6 + 1)
解題要領:
將多項式表示為鏈結串列,如下圖所示:
題目 2:
(第 8節結束) 樹狀結構的使用方式 50
利用鏈結串列表示圖形。請參閱附件 1
題目 3: Keroro 紐約遊記 請參閱 ZeroJudge: http://judge.nccucs.org/ShowProblem?problemid=d120
一、認識樹狀結構 1.教師介紹樹狀結構的名詞 (terminology) 教師利用附件二的圖形,向同學介紹以下的名詞。 (1)節點(node) (2)根(root) (2)祖先與後代(ancestor & descendant) (3)父節點與子節點(Parent & Children) (4)兄弟(sibling) (5)階層(level) (6)分支度(degree) (7)樹葉(leaf) (8)二元樹(Binary Tree):如果一個樹,每個節點的分 支度最多只有 2,則此樹稱作二元樹(Binary Tree)
2.教師請同學舉例日常生活常見的樹狀結構。 參考答案 (1)祖譜 (2)生物的分類 (3)圖書館書籍分類 (4)電腦的檔案系統 (5)學校的行政組織
3.不同種類的樹 教師展示以下樹的圖形,並向同學說明:「樹的
應用非常廣,因此發展出許多不同種類的樹」,讓同
學瞭解樹的應用梗概。 (1)引線二元樹(Threaded Binary Tree) (2)堆績樹(Heaps):Max Heap、Min Heap、MinMax
Heap、Deap (3)選擇樹(Selection Trees):Winner Tree、Loser Tree (4)搜尋樹
二元搜尋樹(Binary Search Tree) 平衡樹(AVL Tree) 紅黑樹(RedBlack Tree) 23 Tree 234 Tree BTree
※備註:此部份重點在讓學生瞭解存在有形形色色的
樹的結構,因此教師僅須展示,大略說明,不需詳
細深入介紹。
二、樹狀結構的操作
由於二元樹的應用最廣,也最常被使用,所以我們以
二元樹作為介紹。
1. 樹的表示方式,主要有 2種: (1)串列指標 (2)陣列
2.串列指標表示法: (1)節點
typedef struct tree_node {
int value; TNode *left; TNode *right;
} TNode;
(2)根 TNode *root;
(3)建立樹:依據樹的結構,分別建立節點,並將指標 連結起來即可。(請參見附件二二)
(4)樹的巡覽(Traversal)
前序 (Preorder) N L R void PreOrder(TNODE *p) {
if (p != NULL) { printf(“%d", p>value); //走訪列印樹根節點 PreOrder(p>left); //走訪左樹 PreOrder(p>right); //走訪右樹
} }
中序 (Inorder) L N R
N
L R
(第 9節結束)
void InOrder(TNODE *p) {
if (p != NULL) { InOrder(p>left); //走訪左樹 printf(“%d", p>value);
//走訪列印樹根節點 InOrder(p>right); //走訪右樹
} }
練習:
後序 (Postorder) L R N 教師請同學仿照前序、中序,自行練習。
參考解答: void PostOrder(TNODE *p) {
if (p != NULL) { PostOrder(p>left); //走訪左樹 PostOrder(p>right); //走訪右樹 printf(“%d", p>value);
//走訪列印樹根節點 }
}
3.陣列表示法 (1)建立樹
宣告一個陣列 #definde MAX 1024 int Tree[MAX]; for (int i=0; i
樹狀結構的練習
(第 10節結束) 認識集合 (Sets)
50
15
void PreOrder(int p) {
if (Tree[p] != 1) { //走訪列印樹根節點 printf(“%d", Tree[p]); PreOrder(p*2+1); //走訪左樹 PreOrder(p*2+2); //走訪右樹
} }
三、練習
教師說明二元搜尋樹的規則後,請同學練習寫一個程
式,完成以下功能: 1. 建立一個二元搜尋樹 2. 利用中序列印出每個節點
測試資料 37, 57, 23, 15, 32, 47, 80, 66
參考資料
二元搜尋樹的定義
二元搜尋樹是一個二元樹,且每個節點的值均大於其
左樹節點值,並小於右樹節點的值。
一、認識集合(Sets) 1. 教師以數學的集合概念,說明資料結構集合(Sets)。
教師可以展示幾個數學的集合,例如: (1) 10的因數的集合 { 1, 2, 5, 10 } (2) 小於 50的質數集合 { 2, 3, 5, 7, 11, 13, ... , 47 } (3) 英文字母的集合 { ‘A‘, ‘B‘, ......, ‘Z‘ } 然後,問同學集合這樣的資料,該如何表示或儲存
呢?並引導學生認識資料結構中的集合(Sets) 。資料 結構中的集合(Sets)適合用來表示數學上或日常生 活中的有限集合。
37
23 57
集合的使用方式
(第 11節結束) 集合的練習
課程總結
(第 12節結束)
35
40
10
2. 集合的實作 集合可以用樹實作,可參閱附件三。
※此部份教師僅須展示並簡略說明概念即可,不必深
入實作細節
二、集合的操作
教師以實際程式碼解說以下基本操作 (1)建立一個集合(Create)。 (2)插入一個元素(Insert)。 (3)刪除一個元素(Delete)。 (4)尋找一個元素(Search)
備註: C語言: 請教師預先利用 C語言寫好 Set 的操作函式,
供學生直接呼叫使用。 C++語言:教師可以直接使用標準函式庫中的 Set 模
版(template)。
三、練習
教師揭示練習題目,並解釋題目意思後,請同學練
習。同學練習時,教師可視同學解題情況,適當提示
同學解題方向。
題目
試利用集合儲存小於 100的質數,然後讓使用者輸入 一個任一正數,程式告知是否在此集合中?輸入1表 列出此集合的所有元素。
解題要領
先寫一個函式,可以判斷所輸入的數,是否為質數。
然後利用迴圈及判斷質數函式,建立集合即可。
資料結構的總結 教師將介紹過的資料結構,作個快速的回顧與複習,
並總結:
資料結構是程式用來組織、儲存及表示資
料的方法,面對問題時,若能善用資料結
構,對於問題的解決,必定可以有很大的
助益。
附件一 鏈結串列
練習題 2
試將下列圖形用鏈結串列 Linked list 表示。
表示方式參考
附件二 樹
一、名詞介紹
二、樹的表示法(串列指標)
*left value *right
*left value *right *left value *right
*root
*left value *right
A
B C D
E F G H I J
L M
node
leaf
parent B
children E
siblings B, D
1
2
3
4 K ancestors A, D, H
degree 3
height or depth = maximum level of any node in the tree = 4
degree of a tree = maximum of the degree of the nodes = 3
三、陣列表示法
父節點位置 (i1)/2 子節點位置 i*2+1, i*2+2
0
1 2
4
Tree[0]
Tree[1]
Tree[2]
Tree[3]
Tree[4]
Tree[5]
Tree[6]
Tree[7]
Tree[8] 陣列 Tree
附件三 集合的實作
集合利用樹狀結構表示
多個集合的表示法
資料來源 http://web.thu.edu.tw/~johnaxer 資料結構 投影片 53
附件四 C++ STL 舉例
1. Stack
#include
stack s; //堆疊中的元素型態為 int
2.Queue
#include
queue q; //佇列中的元素型態為 string
3.Linked list
#include
list link; //鏈結串列中的元素型態為 string
4.Sets #include
set s; //集合中的元素型態為 int