题目
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格 。
示例 1:
输入: "1 + 1"
输出: 2
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/basic-calculator
思路:
首先只给了一个string类型的s,我们要将其中的运算符和数字分开,这里使用一个数字栈和符号栈来存储,
然后就是对数字进行处理,因为是字符串类型,如果是123的话,每次读取的只有一位,所以
if (s[i] >= '0'&&s[i] <= '9')
{
n = n * 10 + s[i] - '0';
}
然后就是对符号的操作,如果是‘( ’ 那么肯定要算括号里的内容,紧接着就是数字操作,如果是‘ )’,那么就是括号完,可以直接计算括号里的结果了,所以就接计算,如果是‘+’ 或者‘-’说明前后两数可加减得结果,所以符号进栈,等待加减操作
可以看出符号操作和数字操作常常在交替进行,所以可以用状态转移的方法来运转整个程序
定义一个flag 来表示什么时候适合计算
对于计算的函数,就是当数字栈元素大于2时将栈顶两个元素pop出来,根据符号栈栈顶元素进行计算,然后返回结果到数字栈顶,然后pop出操作的符号。
class Solution {
public:
int calculate(string s) {
static const int BEGIN = 0;
static const int NUM_STATE = 1;
static const int OP_STATE = 2;
std::stack<int> num;
std::stack<char> op;
unsigned n = 0;
int STATE = 0;
int flag = 0;
for (int i = 0; i < s.length();i++)
{
if (s[i] == ' ')
{
continue;
}
switch (STATE)
{
case BEGIN:
if (s[i] >= '0'&&s[i] <= '9')
{
STATE = NUM_STATE;
}
else
{
STATE = OP_STATE;
}
i--;
break;
case NUM_STATE:
if (s[i] >= '0'&&s[i] <= '9')
{
n = n * 10 + s[i] - '0';
}
else
{
num.push(n);
if (flag == 1)
{
compute(num, op);
}
n = 0;
i--;
STATE = OP_STATE;
}
break;
case OP_STATE:
if (s[i] == '+' || s[i] == '-')
{
op.push(s[i]);
flag = 1;
}
else if (s[i] == '(')
{
STATE = NUM_STATE;
flag = 0;
}
else if (s[i] == ')')
{
compute(num, op);
}
else if (s[i] >= '0'&&s[i] <= '9')
{
STATE = NUM_STATE;
i--;
}
break;
}
}
if (n != 0){
num.push(n);
compute(num, op);
}
if (n == 0 && num.empty())
{
return 0;
}
return num.top();
}
void compute(std::stack<int>&num_stack, std::stack<char>&op_stack)
{
if (num_stack.size() < 2)
{
return;
}
int num1 = num_stack.top();
num_stack.pop();
int num2 = num_stack.top();
num_stack.pop();
if (op_stack.top() == '+')
{
num_stack.push(num2 + num1);
}
else if (op_stack.top() == '-')
{
num_stack.push(num2 - num1);
}
op_stack.pop();
}
};
网友评论