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
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP