先說說運算式有哪些表示法好了!
1. 前置(Prefix)運算式:
運算子放在兩個運算元前面,沒有括號,不易閱讀。
2. 中置(Infix)運算式:
運算子放在兩個運算元之間,可以有括號,最容易閱讀,例如a+b/d這樣的式子
3. 後置(Postfix)運算式:
運算子是放在兩個運算元之後,沒有括號,不易閱讀,後序表示式又稱之為逆向波蘭表示式(Reverse polish notation),它是由波蘭的數學家盧卡謝維奇提出,例如(a+b)*(c+d)這個式子,表示為後序表示式時是ab+cd+*。
運算式轉換分為中序轉前序和中序轉後序表示法,其轉換步驟十分相似,其差異只在運算子是位在運
算元前或後。例如:中序運算式,如下:
A*(B+C)
• 上述運算式轉換成前序和後序表示法的步驟,以運算子優先順序來進行處理,如下圖所示:

另一種方法是先替中序運算式加上完整括號來確認運算的優先順序,如下所示:
中序運算式: A+B*(C+D)-E
加上括號的中序運算式: ((A+(B*(C+D)))-E)
• 上述是加上括號的中序運算式,現在只需從最中間的括號開始,將運算子移到右括號的位置且刪除右號,直到刪除所有右括號為止,如下所示:
將運算子搬移到右括號: ((A(B(CD+*+E-
刪除所有的左括號: ABCD+*+E-
所以A-B/C*(D+E)先用括號化之後變為(A-((B/C)*(D+E)))
去括號後變為ABC/DE+*-
(a*(b+c) – d )中序表示法轉換成後序表示法的結果為何?
(a)abc*+-d (b)ab+c*d- (c)ab+c*-d (d)abc+*d-
九十四年公務人員初等考試試題資料處理大意
例子:a+b*d+c/d
解法
依演算法的輸出過程如下:
| OP | STACK | OUTPUT |
| ( | ( | – |
| a | ( | a |
| + | (+ | a |
| b | (+ | ab |
| ) | – | ab+ |
| * | * | ab+ |
| ( | *( | ab+ |
| c | *( | ab+c |
| + | *(+ | ab+c |
| d | *(+ | ab+cd |
| ) | * | ab+cd+ |
| – | – | ab+cd+* |
C的實作
#include <stdio.h>
#include <stdlib.h>
#define MAX 80
void inToPostfix(char*, char*); // 中序轉後序
int priority(char); // 運算子優先權
int main(void) {
char infix[MAX] = {'0'};
char postfix[MAX]= {'0'};
printf("中序運算式:");
scanf("%s", infix);
inToPostfix(infix, postfix);
int i;
for(i = 0; postfix[i] != '0'; i++) {
printf("%c", postfix[i]);
}
return 0;
}
void inToPostfix(char* infix, char* postfix) {
char stack[MAX] = {'0'};
int i, j, top;
for(i = 0, j = 0, top = 0; infix[i] != '0'; i++) switch(infix[i]) {
case '(': // 運算子堆疊
stack[++top] = infix[i];
break;
case '+': case '-': case '*': case '/':
while(priority(stack[top]) >= priority(infix[i])) {
postfix[j++] = stack[top--];
}
stack[++top] = infix[i]; // 存入堆疊
break;
case ')':
while(stack[top] != '(') { // 遇 ) 輸出至 (
postfix[j++] = stack[top--];
}
top--; // 不輸出 (
break;
default: // 運算元直接輸出
postfix[j++] = infix[i];
}
while(top > 0) {
postfix[j++] = stack[top--];
}
}
int priority(char op) {
switch(op) {
case '+': case '-': return 1;
case '*': case '/': return 2;
default: return 0;
}
}
上例取材自中序式轉後序式(前序式)
在106 年 – 特種考試地方政府公務人員考試/計算機概要也有中序轉後序的考古題,至於中序轉後序線上轉換的程式,後續再看能不能找到。
(a*(b+c)-d)中序表示法轉換成後序表示法的結果為何?
(A)abc+*d-
(B) bc*+-d
(C) ab+c*-d
(D) ab+c*d-
答案:A
相關程式設計文章:
※Python 圖形使用者介面程式設計
※50個 C# 工作面試常見問題
1 則留言