题目:
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格 。
实例:
输入:"1+1"
输出:2
输入:"(1+(4+5+2)-3)+(6+8)"
输出:23
原理:
使用栈加反转字符串的方法解题.
在遇到")"之前,将数字转成string压入栈中;
当遇到")"时,开始出栈,并计算数字之和,其中,减号"-"当做负号使用.计算完成括号内数字之和时,将和转成string重新压入栈中.此举可以保证括号位置的正确性.
C++实现
// 简单计算器问题
class Solution {
public:
void sum(vector<string>& stk){ // 计算括号内的和并pop stk
vector<string> temp;
while(!stk.empty() && stk.back() != "("){ //送入新stk
temp.push_back(stk.back());
stk.pop_back(); // pop除'('外的其他元素
}
if(!stk.empty() && stk.back() == "(") // pop '('
stk.pop_back();
if(temp.back() != "-") temp.emplace_back("+"); // 保证每个数字前面都有自己的符号
reverse(temp.begin(), temp.end());
int ret = 0;
int n = temp.size();
for(int i=0; i<n-1; i+=2){
int num = stoi(temp[i+1]); // 将字符串转成数字
if(temp[i] == "-") num *= (-1);
ret += num; // 括号内求和
}
stk.push_back(to_string(ret));
}
int calculate(string s) {
vector<string> stk;
int n = s.size();
int ret = 0;
string temp;
for(int i=0; i<n; ++i){
if(isdigit(s[i])){
temp += s[i];
}else if(s[i] == '+' || s[i] == '-'){
if(!temp.empty()){
stk.push_back(temp); // 将数字放入队列中;
temp.clear();
}
temp += s[i];
stk.push_back(temp); // 将符号放入队列中
temp.clear();
}else if(s[i] == '('){
temp += s[i];
stk.push_back(temp);
temp.clear();
}else if(s[i] == ')'){ // 遇到)的时候,开始出栈,并进行计算
stk.push_back(temp);
temp.clear();
sum(stk);
}
}
if(!temp.empty()) stk.push_back(temp);
sum(stk);
if(stk.size() == 1) ret = stoi(stk[0]);
return ret;
}
};