實現乙個基本的計算器來計算乙個簡單的字串表示式的值。
字串表示式僅包含非負整數,+, - ,*,/ 四種運算子和空格 。 整數除法僅保留整數部分。
示例 1:
輸入: "3+2*2"
輸出: 7
示例 2:
輸入: " 3/2 "
輸出: 1
示例 3:
輸入: " 3+5 / 2 "
輸出: 5
說明:
(1)你可以假設所給定的表示式都是有效的。
(2)請不要使用內建的庫函式 eval。
參見leetcode 224的解法,首先將中綴表示式轉化為字尾表示式,再計算字尾表示式的值。當然這樣的時間耗費和空間耗費都是挺大的。優點是通用。
class
solution
;public
:int
calculate
(string s)
intevalrpn
(vector
& tokens)
for(
int i=
0;i)else
}return s1.
top();
} vector
mid2post
(string s)
else
s2.push
(tostring
(s[i]))
;//當前符號入棧}}
else
if(s[i]
==')'
) s2.
pop();
//"("
}else
}while
(!s2.
empty()
)return res;
}int
getorder
(char s)
string tostring
(char ch)
};
class
solution
else
if(s[i]
=='*'
|| s[i]
=='/'
)else
}while
(!s2.
empty()
)calc()
;return s1.
top();
}int
getvalue
(int num1,
int num2 ,
char ch)
void
calc()
};
上面兩種解法的時間耗費和空間耗費都比較高,分析一下開銷主要在以下方面:
(1)棧的操作:stl庫本來就慢;
(2)string.substr(int start,int len),stoi(string s)
;
(3)函式的呼叫;
乙個時間和空間相對較優的實現如下:
class
solution
if(c ==
'+'|| c ==
'-'|| c ==
'*'|| c ==
'/'|| i == n -1)
if(c ==
'+'|| c ==
'-'|| i == n -1)
op = c;
num =0;
}}return res;}}
;
(1)for迴圈中盡量避免改變迴圈變數的值,一般都有辦法乙個乙個讀,使用變數記錄即可。(如本題找乙個完整的數,可以用乙個int變數記錄)
(2)為了時空間耗費最優,少呼叫花裡胡哨的函式。
leetcode 227基本計算器II
實現乙個基本的計算器來計算乙個簡單的字串表示式的值。字串表示式僅包含非負整數,四種運算子和空格 整數除法僅保留整數部分。示例 1 輸入 3 2 2 輸出 7 示例 2 輸入 3 2 輸出 1 示例 3 輸入 3 5 2 輸出 5 說明 你可以假設所給定的表示式都是有效的。請不要使用內建的庫函式 ev...
LeetCode227 基本計算器II
感覺自己的思路還不錯,比較簡單清晰,量也比較少,沒有用到記錄運算子的變數或棧,就想把這個思路發一下部落格。題目 實現乙個基本的計算器來計算乙個簡單的字串表示式的值。字串表示式僅包含非負整數,四種運算子和空格 整數除法僅保留整數部分。思路 使用乙個棧用於暫存得不到計算的數字 無法確定優先順序,比如當前...
leetcode 227 基本計算器 II
實現乙個基本的計算器來計算乙個簡單的字串表示式的值。字串表示式僅包含非負整數,四種運算子和空格 整數除法僅保留整數部分。示例 1 輸入 3 2 2 輸出 7 示例 2 輸入 3 2 輸出 1 示例 3 輸入 3 5 2 輸出 5 說明 你可以假設所給定的表示式都是有效的。請不要使用內建的庫函式 ev...