C語言版中綴表達式轉後綴表達式
I 通常,用戶輸入的表達是爲中綴表達式,通過算法,將中綴表達式轉化爲後綴表達式,然後利用棧存儲操作數,遇到operator,彈出棧中的操作數進行相應的運算後再圧棧,直至表達式運算完成或出錯退出。
II 利用“棧”將中綴表達式轉化爲後綴表達式算法:
根據各種運算的運算符的優先級,優先級表格:
操作符ch | # | ( | *、/、% | +、- | ) |
Isp | 0 | 1 | 5 | 3 | 6 |
Icp | 0 | 6 | 4 | 2 | 1 |
III 掃描中綴表達式,將它轉化爲後綴表達式的算法描述:
1、 操作符棧初始化,將結束符“#”進棧。然後讀入中綴表達式字符流的首字符ch;
2、 I)若ch爲操作數,直接輸出,讀下一字符;
II)若ch是操作符,比較ch的優先級icp與當前棧頂操作符op的優先級isp:
If icp(ch) > isp(op) then 令ch進棧,讀入下一個字符;
If icp(ch) < isp(op) then 彈棧並輸出
If icp(ch) == isp(op) then 彈棧但不輸出,若退出的是“(”號則讀入下一個字符ch。
3、 算法結束,輸出序列即爲所求的後綴表達式。
IV 算法C語言實現//============================================================================
// Name : fixTransform.cpp
// Author :
// Version :
// Copyright : Your copyright notice
//============================================================================
#include<stdio.h>
#include<stdlib.h>
#define stkSize 20
#define maxSize 30
int isp(char op){
switch(op){
case '#' : return 0; break;
case '(' : return 1; break;
case '*' : return 5; break;
case '/' : return 5; break;
case '+' : return 3; break;
case '-' : return 3; break;
case ')' : return 6; break;
default : return -1;
}
}
int icp(char op){
switch(op){
case '#' : return 0; break;
case '(' : return 6; break;
case '*' : return 4; break;
case '/' : return 4; break;
case '+' : return 2; break;
case '-' : return 2; break;
case ')' : return 1; break;
default : return -1;
}
}
/**
* 將中綴表達式in[]轉化爲後綴表達式post[]
*/
void infix_to_postfix(char in[], char post[]){
char optr[stkSize];
int top = -1;
char ch, topOp, op;
int i = 0, j = 0;
//初始化符號棧
optr[++ top] = '#';
ch = in[i ++];
while(-1 != top || '#' != ch){
if(ch >= '0' && ch <= '9'){
post[j ++] = ch;
ch = in[i ++];
}
else {
topOp = optr[top];
if(icp(ch) > isp(topOp)){
optr[++ top] = ch;
ch = in[i ++];
} else if(icp(ch) < isp(topOp)){
op = optr[top --];
post[j ++] = op;
}
else{
op = optr[top --];
if('(' == op){
ch = in[i ++]; //消括號
}
}
}
}
post[j] = '#';
}
int main() {
char in[maxSize] = "5+9*(6-4)-9/3#\0", post[maxSize];
for(int i = 0; '#' != in[i]; i ++){
printf("%c", in[i]);
}
printf("\n");
infix_to_postfix(in, post);
for(int i = 0; '#' != post[i]; i ++){
printf("%c", post[i]);
}
printf("\n");
return EXIT_SUCCESS;
}
運行結果截圖:
望每天進步一點,