參考書籍:資料結構(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 遇到加號和減號,...