之前寫過這方面的演算法,用的思想是先將中綴表示式轉化為字尾表示式,再計算。本文採用直接計算中綴表示式的方法,用兩個棧分別儲存,運算子和數值。另外在處理括號問題時,拋開之前增大優先順序的繁瑣方法,直接把括號當做一條新的式子,計算後返回乙個值到原式,這也算是遞迴思想。最後,此次把資料域擴充到實數域。
瑕疵:**沒有考慮除以0和一些不符合的情況,即輸入的式子都是符合運算法則的。因為只是想體現演算法的核心,沒有必要搞得太繁瑣,需要的時候再加就是了。
#include#include#includeusing namespace std;
const int power[6]=;//四則運算的優先順序,分別對應*,+, ,-, ,/
double tqn(char s,int &i)//提取數字
if(s[i]=='.')//小數部分 }
i--;//考慮到原來的函式存在i自增,所以這裡要退一位
return result;
}void calcular(stack&num,stack&op)//計算當前能計算的式子,就是暫時符合運算法則的部分
op.pop(); }}
double play(char s,int &i,char flag)//操作式子 ,flag是式子結束標識
else
{if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/')//遇到運算子
{if(op.empty())//空即入
op.push(s[i]);
else
{if(power[s[i]-42]op;//運算子棧
stacknum;//數值棧
while(cin.getline(s,1000))
{ i=0;
result=play(s,i,'\0');
cout<
中綴表示式求解四則運算
功能實現 四則運算中包含 括號 加減 乘除 小數點 樣例輸入 12.5 8 3 2 3 5 樣例輸出 2 邏輯整理 建立兩個棧,分別用來儲存數字型別和操作符型別。依次讀入每個字元,直至所有字元均遍歷完畢 判斷當前字元s是數字還是操作符 數字 由於數字的位數以及小數點情況均不確定,因此需要從當前字元的...
中綴 字尾表示式 四則運算
中綴表示式轉化為字尾表示式,並通過字尾表示式計算值 轉化規則 出棧 出棧後元素新增到字尾表示式的末尾 中綴表示式掃瞄完畢後,若棧內元素不為空,依次出棧直到棧為空,出棧元素新增到字尾表示式後 舉例 3 2 5 4 2 過程如下 建立操作符棧,以及儲存字尾表示式的佇列 從頭到尾掃瞄中綴表示式,首先掃瞄到...
四則運算的中綴表示式和字尾表示式
中綴表示式 就是運算符號在數字中間的表達方式。字尾表示式 運算符號在數字的後面出現。1 中綴表示式向字尾表示式的轉換方法 規則 從左到右遍歷中綴表示式的每個數字和符號,若是數字就輸出,即成為字尾表示式的一部分 若是符號,就判斷當前符號與棧頂符號的優先順序,如果是右括號或者是優先順序低於棧頂符號 乘除...