150. 逆波蘭表示式求值
題目連結:https://leetcode.cn/problems/evaluate-reverse-polish-notation/
題目難度:中等
文章講解:https://programmercarl.com/0150.逆波蘭表示式求值.html
影片講解:https://www.bilibili.com/video/BV1kd4y1o7on
題目狀態:多次修改 bug 後透過
個人思路:
透過棧進行解決。
先判斷佇列中的元素是否為數字型別。若為數字型別,壓入棧;若不是數字型別,則肯定是運算子,使用switch
結構進行運算,將棧中的頭兩個元素彈出,進行運算子運算,運算後將結果在壓入棧中。最後返回棧頂元素。
修改 bug 的過程:
- 棧的空間:當棧內有兩個或兩個以上的元素的時候才能進行運算子運算。
- 符號判斷:在判斷佇列元素是否為數字的時候,忘記還有負數這一項,需要先判斷元素的第一個元素是否為
-
且元素是否含有多個元素,若是,則從元素中的下一個元素判斷是否為數字;若不是,則直接判斷。
程式碼實現:
class Solution {
public:
bool isNum(const string &s) {
if(s[0] == '-' && s.size() > 1) {
for(int i = 1; i < s.size(); ++i) {
if(!isdigit(s[i])) return false;
}
} else if(s[0] == '-' && s.size() == 1) {
return false;
} else {
for(auto &elem: s) {
if(!isdigit(elem)) return false;
}
}
return !s.empty();
}
int evalRPN(vector<string>& tokens) {
stack<int> st;
for(auto &token: tokens) {
if(isNum(token)) {
st.push(stoi(token));
}
else if(!st.empty() && st.size() >= 2){
int op1 = st.top(); st.pop();
int op2 = st.top(); st.pop();
int res = 0;
switch(token[0]) {
case '+': res = op2 + op1; break;
case '-': res = op2 - op1; break;
case '*': res = op2 * op1; break;
case '/': res = op2 / op1; break;
}
st.push(res);
}
}
return st.top();
}
};