免費開始練習
高考申論題 111年 [資訊處理] 資料結構

第 一 題

以下是一中序運算式(Infix expression)轉換(Convert)成後序運算式(Postfix expression)的演算法 operstk = the empty stack; while(not end of input){ symb = next input character; if(symb is an operand) add symb to the postfix string; else{ while(!empty(operstk) && precedence(stacktop(operstk),symb)){ topsymb = pop(operstk); add topsymb to the postfix string; } /*end while*/ if (empty(operstk) || symb != ‘)’) push(operstk, symb); else topsymb = pop(operstk); } /*end else*/ } /*end while*/ while(!empty(operstk)){ topsymb = pop(operstk); add topsymb to the postfix string; } /*end while*/ 其中資料結構: “operstk”:用來儲存運算子的堆疊(Stack); “stacktop(operstk)”:表示 top 指標所指堆疊 operstk 的運算子; 程序(Procedures)或函數(Functions): “empty(operstk)”:檢查堆疊 operstk 是否為空的布林函數; “pop(operstk)”:從堆疊 operstk 中取出一運算子; “push(operstk, symb)”:將運算子 symb 存入堆疊 operstk; “precedence(op1,op2)”:布林函數,定義在一沒有左右括弧的中序運算式中,op1 運算子出現在 op2 運算子的左邊時,當 op1 運算子優先順序不低於 op2 運算子,則設定成 TRUE,否則為 FALSE。例如,我們給定 precedence(‘*’, ‘+’)=TRUE , precedence(‘+’, ‘+’)=TRUE , precedence(‘+’, ‘*’)=FALSE,為了處理運算式左右括弧,設定下列的 precedence: precedence(‘(’, op) = FALSE /*op 為任一運算子*/ precedence(op, ‘(’) = FALSE /*op 為除’)’外的任一運算子*/ precedence(op, ‘)’) = TRUE /*op 為除’(’外的任一運算子*/ precedence(‘)’, op) = undefined /*op 為任一運算子*/ 以中序運算式(2+3)*4 為例,執行上述演算法,依處理每一個運算子或運算元時,輸出 postfix string 及 operstk 內容為何(“eos”表示 end of string)?(25 分)
📝 此題為申論題

思路引導 VIP

這是一題典型的「中序轉後序」演算法追蹤題。關鍵在於徹底理解題目給定的 precedence(op1, op2) 函數行為。這與一般的運算子優先權概念稍有不同,它定義的是「何時該從堆疊中彈出(pop)運算子」。

  1. 辨識規則:當 precedence(stacktop, symb) 為 TRUE 時,表示堆疊頂端的運算子優先權較高或相等,應先輸出。對於括弧,題目特別定義:左括弧 ( 進入堆疊時永遠不彈出其他符號(precedence 為 FALSE),而遇到右括弧 ) 時,會不斷彈出堆疊內容直到遇到左括弧為止。
🤖
AI 詳解 AI 專屬家教

【考點分析】 本題考察資料結構中「堆疊(Stack)」的應用,特別是中序(Infix)轉後序(Postfix)的經典演算法。核心爭點在於括弧在堆疊中的處理機制以及優先權函數的邏輯判定。 【理論/法規依據】

▼ 還有更多解析內容

📝 同份考卷的其他題目

查看 111年[資訊處理] 資料結構 全題

升級 VIP 解鎖