資料結構(6)--棧的應用之中綴表示式求值
阿新 • • 發佈:2019-01-05
參考書籍:資料結構(C語言版) 嚴蔚敏 吳偉民編著 清華大學出版社
1.簡要說明
分析:設操作符棧op棧 運算元棧num棧
op棧裡不可能出現')',只可能有'+'、'-'、'*'、'/'、'(',設ch為當前字元,假設輸入都是合法的
1.ch為'+'、'-',則op棧頂為'('時ch入棧,否則進行運算直至op棧頂為'('
2.ch為'*'、'/',則op棧頂為'('、'+'、'-'時ch入棧,否則op棧頂為'*'、'/',此時要進行運算
3.ch為數字,入num棧
4.ch為'(',則入op棧
5.ch為')',則迴圈計算直至出現op棧頂為'(',並彈出棧頂元素'('
5.ch為'#',則輸入結束,此時應繼續迴圈計算至op棧為空,那麼彈出num棧棧頂元素即為運算結果
演算法的流程圖如下:
2.程式碼實現
//例項:(5*(12-3)+4)/2=24;4+2*3-10/5=8;
#include<stdio.h>
#define MAXSIZE 30
char op[MAXSIZE], num[MAXSIZE];//全域性變數
int opTop, numTop;
void calculate(){ char op1, op2; int opf; op2 = num[numTop-1]; numTop--; op1 = num[numTop-1]; numTop--; opf = op[opTop-1]; opTop--; int tmpResult = 0; switch(opf){ case '+': tmpResult = op1 + op2; break; case '-': tmpResult = op1 - op2; break; case '*': tmpResult = op1 * op2; break; case '/': tmpResult = op1 / op2; break; } num[numTop] = tmpResult; numTop++; }
//處理簡單表示式 void dealExpression(){ //初始化兩個棧 opTop = 0, numTop = 0; printf("請輸入簡單表示式(以#號結束):"); char currentChar; scanf("%c", ¤tChar); while(currentChar!='#'){ switch(currentChar){ case '+': case '-': while(opTop&&op[opTop-1]!='('){ calculate(); } op[opTop] = currentChar; opTop++; scanf("%c", ¤tChar); break; case '*': case '/': if(opTop&&(op[opTop-1]=='*'||op[opTop-1]=='/')){ calculate(); } op[opTop] = currentChar; opTop++; scanf("%c", ¤tChar); break; case '(': op[opTop] = currentChar; opTop++; scanf("%c", ¤tChar); break; case ')': while(op[opTop-1]!='('){//當前是'(',則op棧一定能有'('匹配到,即op棧一定不為空 calculate(); } opTop--;//出棧,彈出左括號 scanf("%c", ¤tChar); break; default://currentChar為數字,則入num棧 int opNum = 0; do{ opNum = opNum*10 + currentChar-'0'; scanf("%c", ¤tChar); }while(currentChar>='0'&¤tChar<='9'); num[numTop] = opNum; numTop++; break; }//end switch } while(opTop){ calculate(); } int result = num[numTop-1]; printf("計算結果是%d\n", result); }
3.演示
void main(){
dealExpression();
}