C++基础计算器III
假设我们有一个简单的表达式字符串,我们需要实现一个基础计算器来计算该表达式的值。表达式字符串可能包含括号、加号(+)或减号(-)、非负整数和空格。表达式字符串仅包含非负整数、+、-、*、/运算符、括号和空格。整数除法应向零取整。
例如,如果输入是 "6-4 / 2",则输出为 4
为了解决这个问题,我们将遵循以下步骤:
l1 := 0, l2 := 1
o1 := 1, o2 := 1
定义一个栈 st
n := s 的大小
for i := 0 to n-1 do:
x := s[i]
if x >= '0' and x <= '9' then:
num := x - '0'
while (i + 1 < n and s[i + 1] >= '0' and s[i + 1] <= '9') do:
i := i + 1
num := (num * 10) + (s[i] - '0')
l2 := (if o2 == 1 then l2 * num else l2 / num)
else if x == '(' then:
将 l1 推入 st,将 o1 推入 st
将 l2 推入 st,将 o2 推入 st
l1 := 0, o2 := 1
o1 := 1, l2 := 1
else if x == ')' then:
temp := l1 + o1 * l2
o2 := st 的栈顶元素
从 st 中弹出栈顶元素
l2 := st 的栈顶元素
从 st 中弹出栈顶元素
o1 := st 的栈顶元素
从 st 中弹出栈顶元素
l1 := st 的栈顶元素
从 st 中弹出栈顶元素
l2 := (if o2 == 1 then l2 * temp else l2 / temp)
else if x == '*' or x == '/' then:
o2 := (if x == '*' then 1 else -1)
else if x == '+' or x == '-' then:
if x == '-' and (i == 0 or (i - 1 >= 0 and s[i - 1] == '(')) then:
o1 := -1
忽略以下部分,跳到下一个迭代
l1 := l1 + o1 * l2
o1 := (if x == '+' then 1 else -1)
l2 := 1, o2 := 1
return l1 + o1 * l2
让我们来看下面的实现,以便更好地理解:
示例
#include <bits/stdc++.h> using namespace std; typedef long long int lli; class Solution { public: int calculate(string s) { lli l1 = 0; lli l2 = 1; lli o1 = 1; lli o2 = 1; stack<lli> st; lli n = s.size(); for (lli i = 0; i < n; i++) { char x = s[i]; if (x >= '0' && x <= '9') { lli num = x - '0'; while (i + 1 < n && s[i + 1] >= '0' && s[i + 1] <= '9') { i++; num = (num * 10) + (s[i] - '0'); } l2 = (o2 == 1) ? l2 * num : l2 / num; } else if (x == '(') { st.push(l1); st.push(o1); st.push(l2); st.push(o2); l1 = 0; o2 = 1; o1 = 1; l2 = 1; } else if (x == ')') { lli temp = l1 + o1 * l2; o2 = st.top(); st.pop(); l2 = st.top(); st.pop(); o1 = st.top(); st.pop(); l1 = st.top(); st.pop(); l2 = (o2 == 1) ? l2 * temp : l2 / temp; } else if (x == '*' || x == '/') { o2 = (x == '*') ? 1 : -1; } else if (x == '+' || x == '-') { if (x == '-' && (i == 0 || (i - 1 >= 0 && s[i - 1] == '('))) { o1 = -1; continue; } l1 += o1 * l2; o1 = (x == '+') ? 1 : -1; l2 = 1; o2 = 1; } } return l1 + o1 * l2; } }; main(){ Solution ob; cout << (ob.calculate("(5+9*3)/8")); }
输入
"(5+9*3)/8"
输出
4