目錄
課前預習:
**實現過程:
1.先定義一下各運算子的優先順序
2.轉化成逆波蘭式
3.計算逆波蘭式
測試結果:
刷題檢測**
1.逆波蘭式的定義,如何將中綴表示式轉化成逆波蘭式
2.為什麼要轉化成逆波蘭式,逆波蘭式有什麼優點
3.各運算子之間的優先順序(+、-、*、/)
4.此計算器只支援輸入非負整數數,不支援輸入負數,要是非要輸入負數可以這樣(0-1)
解釋:左括號優先順序最低,+-略高,*/較高,右括號最高
int priority(string op)
幾個關鍵的點
(1)碰到左括號直接進入符號棧
(2)右括號優先順序最高,遇到右括號將符號棧中的運算子新增到逆波蘭式陣列中,直到遇到左括號,並將左括號彈出
(3)當前為運算子,如果棧頂的運算子優先順序高於當前或等於(有些文章中將在符號棧中的運算子優先順序看做高於棧外同類運算子,我這裡不這樣了,感覺還是我這樣簡單點)當前運算子,彈出棧頂運算子新增到逆波蘭式陣列中(迴圈)
(4)最後如果符號棧非空,將符號棧中的元素彈出新增到逆波蘭式陣列中
/*將表示式轉換成逆波蘭式*/
vectortopolish(string str)
if (str[i] >= '0'&&str[i] <= '9')/*數字*/
i--;
polish.push_back(str1);
continue;
}
if (str[i] == ')')/*右括號*/
else
}} else/*加減乘除運算子*/
opstack.push(str1); // 新增到符號棧中
} }//剩餘的運算子新增到polish中
while (!opstack.empty())
return polish;
}
逆波蘭式有個大大的優點,就是符號沒有優先順序,也就是說我們碰到運算子就進行運算,非常簡便
/*將逆波蘭式進行計算*/
int calculation(vectorpolish)
else
}return data.top();
}
以上就是實現過程,下面就是全部**:
#include #include#include#include#includeusing namespace std;
int priority(string op);
vectortopolish(string str);
int calculation(vectorpolish);
int main()
/*返回運算子的優先順序*/
int priority(string op)
/*將表示式轉換成逆波蘭式*/
vectortopolish(string str)
if (str[i] >= '0'&&str[i] <= '9')/*數字*/
i--;
polish.push_back(str1);
continue;
}
if (str[i] == ')')/*右括號*/
else
}} else/*加減乘除運算子*/
opstack.push(str1); // 新增到符號棧中
} }//剩餘的運算子新增到polish中
while (!opstack.empty())
return polish;
}/*將逆波蘭式進行計算*/
int calculation(vectorpolish)
else
}return data.top();
}
輸入:string str = "1*(1+2*(1*2*2-3+5*1))";
輸出:13
如果想要練手,並檢驗是否正確,可以在leetcode**上檢測一下
leetcode-計算器
題目和我的**稍有不同
C語言實現帶括號的計算器
中綴表示式轉字尾表示式的應用 我的演算法以及思路 首先將輸入的東西作為字串存入到乙個字串陣列,然後將中綴表示式轉化為字尾表示式 其中關鍵在於運算子的轉化,比較棧頂元素和當前運算子的優先順序,如果棧頂元素的優先順序大,則壓入棧中,否則把棧裡的運算子彈出直到為空,並且加入到字尾表示式的字串中,再壓棧,最...
棧實現的帶括號的計算器
帶括號的表示式計算 通過棧的應用來實現,建立運算元棧和運算子棧,運算子有優先順序。規則 1.自左至右掃瞄表示式,凡是遇到運算元一律進運算元棧。2.當遇到運算子時如果它的優先順序比運算子棧棧頂元素的優先順序高就進棧。反之,取出棧頂運算子和運算元棧棧頂 的連續兩個運算元進行運算,並將結果存入運算元棧,然...
棧實現的帶括號的計算器
帶括號的表示式計算 通過棧的應用來實現,建立運算元棧和運算子棧,運算子有優先順序。規則 1.自左至右掃瞄表示式,凡是遇到運算元一律進運算元棧。2.當遇到運算子時如果它的優先順序比運算子棧棧頂元素的優先順序高就進棧。反之,取出棧頂運算子和運算元棧棧頂 的連續兩個運算元進行運算,並將結果存入運算元棧,然...