資料結構 6 棧的應用之中綴表示式求值

2021-07-09 21:37:13 字數 1714 閱讀 8587

參考書籍:資料結構(c語言版) 嚴蔚敏 吳偉民編著 清華大學出版社

分析:設操作符棧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棧棧頂元素即為運算結果

演算法的流程圖如下:

//例項:(5*(12-3)+4)/2=24;4+2*3-10/5=8;

#include#define maxsize 30

char op[maxsize], num[maxsize];//全域性變數

int optop, numtop;

void calculate()

num[numtop] = tmpresult;

numtop++;

}

//處理簡單表示式

void dealexpression()

op[optop] = currentchar;

optop++;

scanf("%c", ¤tchar);

break;

case '*':

case '/':

if(optop&&(op[optop-1]=='*'||op[optop-1]=='/'))

op[optop] = currentchar;

optop++;

scanf("%c", ¤tchar);

break;

case '(':

op[optop] = currentchar;

optop++;

scanf("%c", ¤tchar);

break;

case ')':

while(op[optop-1]!='(')

optop--;//出棧,彈出左括號

scanf("%c", ¤tchar);

break;

default://currentchar為數字,則入num棧

int opnum = 0;

dowhile(currentchar>='0'&¤tchar<='9');

num[numtop] = opnum;

numtop++;

break;

}//end switch

} while(optop)

int result = num[numtop-1];

printf("計算結果是%d\n", result);

棧的應用之中綴表示式轉字尾表示式

由於中綴表示式有括號的存在,其運算次序比較複雜,直接分析有些難度。先考慮不帶括號的中綴表示式的轉換。由於運算符號具有不同的優先順序,當前的運算子不能直接放在運算元的後面,需要考慮下乙個運算子的優先順序。對比三個不同的中綴表示式轉換為字尾表示式的結果 可以發現 1.字尾表示式數字的出現順序和中綴表示式...

資料結構棧之中綴表示式轉字尾

對於乙個中綴表示式,假設a b a b 我們對它從左至右進行遍歷,當遇到運算元時直接輸出 當遇到操作符且棧為空時,將操作符壓入棧 當遇到左括號時,將其入棧 當遇到右括號時,將棧中左括號上面的元素依次出棧並輸出,最後將左括號出棧 但不輸出 當遇到操作符時 此時棧非空 當棧頂元素也為操作符且優先順序大於...

棧應用之中綴表示式轉字尾表示式(C語言)

我從網上摘取了幾個思路,這裡的思路在優先順序的比較上大致相同,方法多變,這裡不再一一詳解。1 數字直接輸出 2 遇到左括號直接入棧,遇到右括號將棧中左括號之 棧的運算子全部彈棧輸出,同時左括號出棧但是不輸出。3 遇到乘號和除號直接入棧,直到遇到優先順序比它更低的運算子,依次彈棧。4 遇到加號和減號,...