810 likes | 928 Views
第 四 章 -. 堆疊. 第四章堆疊. 4-1 堆疊觀念 4-2 堆疊實作 4-3 堆疊應用-函數的呼叫與返回 4-4 運算式求值 4-5 專題研究-騎士巡邏. 4-1 堆疊觀念. 特殊的串列 新增、刪除都在固定的一端,稱為頂端 後進先出 堆疊運算 推入 取出 空堆疊判斷 堆疊滿溢判斷. 推入- push. 取出- pop. 4.2 陣列實作. 陣列 程式撰寫容易 靜態資料處理-空間固定. 4.2.1 堆疊產生. 配置一個陣列空間 變數宣告 stack[] 儲存資料所需之陣列空間 top 記錄資料新增位置
E N D
第四章- 堆疊 資料結構 in C
第四章堆疊 • 4-1堆疊觀念 • 4-2堆疊實作 • 4-3堆疊應用-函數的呼叫與返回 • 4-4運算式求值 • 4-5專題研究-騎士巡邏 資料結構 in C
4-1 堆疊觀念 • 特殊的串列 • 新增、刪除都在固定的一端,稱為頂端 • 後進先出 • 堆疊運算 • 推入 • 取出 • 空堆疊判斷 • 堆疊滿溢判斷 資料結構 in C
推入-push 資料結構 in C
取出-pop 資料結構 in C
4.2 陣列實作 • 陣列 • 程式撰寫容易 • 靜態資料處理-空間固定 資料結構 in C
4.2.1 堆疊產生 • 配置一個陣列空間 • 變數宣告 • stack[] • 儲存資料所需之陣列空間 • top • 記錄資料新增位置 • 代表陣列中之資料總數 • N • 記錄陣列大小 資料結構 in C
產生一個含20個整數的陣列堆疊 資料結構 in C
資料推入 • 新資料儲存到 top 所指的位置 • top 值加 1,表示往上移動 資料結構 in C
資料推入 資料結構 in C
資料推入 資料結構 in C
教學重點 C 允許程式師將上述二個敘述合併成: stack[top++] = data; 其執行的結果事先將data 存入stack[top] 的位置,再對top 的值加1。 資料結構 in C
資料取出 • top 值減 1 • 取出並傳回 top 所指位置的資料 資料結構 in C
資料取出 資料結構 in C
資料取出 資料結構 in C
教學重點 上述二個敘述合併成: return stack[--top]; top 的值會先減1,再將stack[top] 的值傳回。 資料結構 in C
堆疊滿溢判斷 • top 值等於 N 資料結構 in C
教學重點 上述if 敘述可以改寫成: return top == N; top 的值如果等於N,則top == N的運算結果為 TRUE,所傳回值為TRUE;否則運算和傳回的 結果為FALSE 資料結構 in C
空堆疊判斷 • 頂端變數 top 即是資料總數 • top 值等於 0,表示空堆疊 資料結構 in C
空堆疊判斷 資料結構 in C
教學重點 上述if 敘述可以改寫成: return top == 0; 資料結構 in C
程式範例 推入N+1筆資料 取出N+1筆資料 資料結構 in C
指標參照實作 • 指標參照 • 程式較為複雜 • 動態資料處理-空間彈性 資料結構 in C
堆疊產生 • 定義一個堆疊的節點結構(STK_NODE) • data:記錄堆疊資料所需之資料欄位 • next:記錄下一個節點位置之指標參照 資料結構 in C
堆疊節點結構 資料結構 in C
堆疊產生 • 宣告一個初值為 NULL 的頂端變數 top • void createSTK • { • top = NULL; • } 資料結構 in C
資料推入 • 推入第一筆資料 資料結構 in C
資料推入 • 推入第二筆以後的資料 資料結構 in C
資料推入 push() • void push(int data) • { • STK_NODE *new_node; • node.next=(STK_NODE *)malloc(sizeof(STK_NODE)) • new_node->data = d; • new_node->next = top; • top = new_node; • } 1 2 3 4 5 6 7 8 資料結構 in C
資料取出 資料結構 in C
資料取出 • 取出堆疊頂端資料 1 int pop() 2 { 3 STK_NODE *t = top; 4 int data = top->data; 5 top = top->next; 6 free(t); 7 return(data); 8 } 資料結構 in C
堆疊已空判斷 • 判斷頂端變數 top 值是否等於 null 1 int isEmpty() 2 { 3 if (top == NULL) 4 return 1; 5 else 6 return 0; 7 } 資料結構 in C
4-3堆疊應用-函數的呼叫與返回 • 函數呼叫 當程式執行到遇到由函數名稱所組成的敘述時,就會跳到該函數的第一行繼續執行 • 函數返回 等到該函數執行到return敘述時,就會跳回函數呼叫的下一行 資料結構 in C
程式範例 資料結構 in C
程式在main()內執行 top → 關於main()的活動紀錄 資料結構 in C
main()呼叫a() top → 關於a()的活動紀錄 資料結構 in C
a()呼叫b() top → 關於b()的活動紀錄 資料結構 in C
b()呼叫c() top → 關於c()的活動紀錄 資料結構 in C
4-4運算式求值 • 運算式的組成 • 運算元 • 運算子 • 左右括號 • 1 * 2 + 3 * (4 + 5) 資料結構 in C
運算式的表示式 • 中序運算式 • 運算子放在二運算元之中 • 1 + 2 • 前序運算式 • 運算子放在二運算元之前 • + 1 2 • 後序運算式 • 運算子放在二運算元之後 • 1 2 + 資料結構 in C
中序轉後序 • 將運算子移至二運算元的後面,運算元順序維持不變 • 依運算子之優先序,逐一轉換 • 1 + 2 * (3 + 4) • 1. 1 + 2 * 3 4 + • 2. 1 + 2 3 4 + * • 3. 1 2 3 4 + * + 資料結構 in C
中序轉後序-完全括號法 • 將運算子和其運算元加上一組括號 • 將運算子移至對應的右括號 • 刪去所有的左右括號 • 1 * 2 + 3 * (4 + 5) • 1 2 * 3 4 5 + * + 資料結構 in C
中序轉前序-完全括號法 • 將運算子和其運算元加上一組括號 • 將運算子移至對應的左括號 • 刪去所有的左右括號 • 1 * 2 + 3 * (4 + 5) • + * 1 2 * 3 + 4 5 資料結構 in C
中序轉後序演算法 • 1.從中序式字串由左至右,一次讀入一個字元,放到變數 ch 中,執行步驟 2 ~ 4 • 2.運算元處理 • 如果 ch 是一個運算元,直接輸出到後序式字串中 • 3.括號處理: • 3.1 如果 ch 是左括號 ,直接推入堆疊中。 • 3.2 如果 ch 是右括號 ,重複取出堆疊中的運算子,並輸出到後序式字串中,直到左括號出現為止。 資料結構 in C
中序轉後序演算法(續) • 4. 運算子處理: • 4.1 如果目前是空堆疊,直接將 ch 推入堆疊 • 4.2 如果不是空堆疊,假設頂端運算子為 op • 4.2.1 如果 ch 的優先序小於等於 op 的優先序,取出 op 並存入後序式字串,回到步驟 4.1 • 4.2.2 將 ch 推入堆疊中 • 5.最後,取出堆疊中的運算子,存入後序式字串,直到堆疊已經空了為止 資料結構 in C
中序轉後序的堆疊變化 資料結構 in C