目录
题目描述
时间限制: 1S类别: DS:栈->栈的应用
问题描述 :
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。
示例 1:
输入:s = "1 + 1"
输出:2
示例 2:
输入:s = " 2-1 + 2 "
输出:3
示例 3:
输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23
说明:
1 <= s.length <= 3 * 10^5
s 由数字、'+'、'-'、'('、')'、和 ' ' 组成
s 表示一个有效的表达式
'+' 不能用作一元运算(例如, "+1" 和 "+(2 + 3)" 无效)
'-' 可以用作一元运算(即 "-1" 和 "-(2 + 3)" 是有效的)
输入中不存在两个连续的操作符
每个数字和计算的结果将不超过有符号的32位整数(即int型整数)的表示范围
输入说明 :
输入一行字符串s,s 由数字、'+'、'-'、'('、')'、和 ' ' 组成,s为一个有效表达式
输出说明 :
输出一行,表示结果
输入范例 :(1+(4+5+2)-3)+(6+8)
输出范例 :23
分析与思考
/* * 问题一 * 多位数数字的记录通过数字与非数字符号之间的分开处理实现 * 通过for循环遍历,同时只有一个if else语句一个针对于数字一个针对于非数字,这样如果数字连续可以实现前字符串雨后字符串的关联 * 同理,这样也可以实现前符号与后符号的关联比如‘+’或‘-’与‘(’或‘)’的关联,如果前+后(那么就要push一个新基础符号用1代表+ * 但这里的符号没用这种方法,用了更简单的 * 问题二 * * 空格问题,不仅仅是2+ 5变成2+5还要2+ 2 5变成2+25 * 这就意味着把空格问题的处理代码放到对数字的处理部分中 * 问题三 * * *这道题难点在于变号 * 定义一个名词:基础符号 * 括号括住的每一层,都有一个基本符号,可以是+也可以是-,就是变号是在什么符号的基础上变号,那个符号就叫做这一括号层基础符号 * 比如说一开始基础符号是+,“-()”的括号里面的式子基础符号是- * 它通过栈的层次性,对应了括号的不同层次性,从而实现了不同括号内部不同符号的变号以及不变号的操作 */
代码
#include "bits/stdc++.h"
#include "stack"
using namespace std;
class Solution {
public:
int calculate(string s) {
stack<int> ops;//储存不同层次括号的基础符号
ops.push(1);
int sign=1;//直接操作符号,也叫做去掉一切符号以后这个数字前面的真正符号用sign表示
int num=0,total=0;
int len=s.size();
for(int i=0;i<len;) {
if(!isdigit(s[i])&&s[i]!=' ') {
if (s[i] == '+') {
sign = ops.top();//如果是+那就直接沿袭这个括号层次中的基础符号,用1代替
} else if (s[i] == '-') {
sign = -ops.top();//如果是-那就直接拿出相反的,用-1代替
} else if (s[i] == '(') {
ops.push(sign);//设置新的一层的基础符号,用括号前的符号设置,也就是之前设置过的sign的值来代表
} else if (s[i] == ')') {
ops.pop();//出栈,讲到下一层次
}
num = 0;
i++;
}
else while (isdigit(s[i]) || s[i] == ' ') {
if (s[i] == ' ')
;
else
num = num * 10 + int(s[i] - '0');
i++;
}
total += (sign * num);
}
return total;
}
};
int main(){
string string1;
getline(cin,string1);
Solution s;
int sum=s.calculate(string1);
cout<<sum;
}