每日编程中遇到任何疑问、意见、建议请公众号留言或直接撩Q474356284(备注每日编程)
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式可以包含左括号 (
,右括号 )
,加号 +
,减号 -
,非负整数和空格
。
示例 1:
输入: "1 + 1"
输出: 2
示例 2:
输入: " 2-1 + 2 "
输出: 3
示例 3:
输入: "(1+(4+5+2)-3)+(6+8)"
输出: 23
说明:
你可以假设所给定的表达式都是有效的。
请不要使用内置的库函数
eval
。
解决方法:
(1)算法的基本思想:
使用数字栈和符号栈。鉴于此题只有加减,可用sign为正负1指示符号栈。
(2)代码实现:
class Solution
{
public:
int calculate(string s)
{
stack<long> nums, ops;
long num = 0;
long res = 0;
int sign = 1;
for (char c : s)
{
//如果c是数字的话(仅有正数),按位读取,比如21,第一次读取2,第二次读取1
//最后得到的是long num = 21;
if (isdigit(c))
{
num = num * 10 + c - '0';
}
else
{
res += sign * num;
num = 0;
if (c == '+')
sign = 1;
if (c == '-')
sign = -1;
if (c == '(')
{
nums.push(res); //保存之前的数字计算结果
ops.push(sign); //保存括号外面的符号
res = 0; //重置res
sign = 1; //重置sign
}
if (c == ')')
{
//取栈头sign和res的结果与num中保存的上次结果相加
res = ops.top() * res + nums.top();
ops.pop();
nums.pop();
}
}
}
res += sign * num; //最后一次计算
return res;
}
};
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+
, -
,*
,/
四种运算符和空格
。整数除法仅保留整数部分。
示例 1:
输入: "3+2*2"
输出: 7
示例 2:
输入: " 3/2 "
输出: 1
示例 3:
输入: " 3+5 / 2 "
输出: 5
说明:
你可以假设所给定的表达式都是有效的。
请不要使用内置的库函数
eval
。
class Solution {
public:
int calculate(string s) {
}
};