问题:
- 实现一个基本的计算器来计算一个简单的字符串表达式的值。
- 字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格 。
使用用堆栈结构实现:
用状态机的实现思路图:
———— 图片来自小象学院教程
// 计算函数
void compute(stack<long>& number_stack, stack<char>& operation_stack) {
if (number_stack.size() < 2)
return;
long num2 = number_stack.top();
number_stack.pop();
long num1 = number_stack.top();
number_stack.pop();
if (operation_stack.top() == '+') {
number_stack.push(num1 + num2);
}
else if(operation_stack.top()=='-'){
number_stack.push(num1 - num2);
}
operation_stack.pop();
}
// 算法写在一个类中
class Solution {
public:
long calculate(string s) {
static const int STATE_BEGIN = 0;
static const int NUMBER_STATE = 1;
static const int OPERATION_STATE = 2;
stack<long> number_stack;
stack<char> operation_stack;
long number = 0;
int STATE = STATE_BEGIN;
int compute_flag = 0;
for (int i = 0; i < s.length(); i++)
{
if (s[i] == ' ')
continue;
// 用菜单实现三种状态
switch (STATE)
{
case STATE_BEGIN:
if (s[i] >= '0' && s[i] <= '9') {
STATE = NUMBER_STATE;
}
else {
STATE = OPERATION_STATE;
}
i--;
break;
case NUMBER_STATE:
if (s[i] >= '0' && s[i] <= '9') {
// 字符串转数字
number = number * 10 + s[i] - '0';
}
else {
number_stack.push(number);
if (compute_flag == 1)
compute(number_stack, operation_stack);
number = 0;
i--;
STATE = OPERATION_STATE;
}
break;
case OPERATION_STATE:
if (s[i] =='+'||s[i]=='-')
{
operation_stack.push(s[i]);
compute_flag = 1;
}
else if (s[i] == '(') {
STATE = NUMBER_STATE;
compute_flag = 0;
}
else if (s[i] >= '0' && s[i] <= '9') {
STATE = NUMBER_STATE;
i--;
}
else if (s[i] == ')') {
compute(number_stack, operation_stack);
}
break;
default:
break;
}
}
if (number != 0) {
number_stack.push(number);
compute(number_stack, operation_stack);
}
if (number == 0 && number_stack.empty()) {
return 0;
}
return number_stack.top();
}
};
测试:
// 以下为测试
int main() {
string s = "20+(18-8)-(90-89)";
Solution solve;
long result = solve.calculate(s);
cout << "20+(18-8)-(90-89) = " << result;
return 0;
}
结果:
20+(18-8)-(90-89) = 29
ps: 小象学院教程 https://www.bilibili.com/video/BV1GW411Q77S?t=7029&p=2 的笔记
LeetCode题号: 224