您的位置:首页 > 编程语言 > C语言/C++

Basic Calculator

2016-05-26 21:34 525 查看
题目描述:

Implement a basic calculator to evaluate a simple expression string.

The expression string may contain open 
(
 and closing parentheses 
)
,
the plus 
+
 or minus sign 
-
, non-negative integers
and empty spaces 
.

You may assume that the given expression is always valid.

Some examples:

"1 + 1" = 2
" 2-1 + 2 " = 3
"(1+(4+5+2)-3)+(6+8)" = 23


Note: Do not use the 
eval
 built-in
library function.
解题思路:使用两个stack:nums和ops,nums用来保存操作数,ops用来保存操作符。从左到右扫描输入的字符串表达式,若读到的是操作数,直接存入nums栈;若读到的是空格,则直接跳过;若读到的是运算符:
1)该运算符是'+','-'或'(',则直接存入ops栈;

2)该运算符是')',则把ops栈中第一个‘(’前的所有运算符依次出栈,并存入一个临时的栈tmp_ops,同时把栈nums中的对应元素也依次出栈,并存入一个临时的栈tmp_nums,然后根据tmp_ops和tmp_nums计算出一个值存入栈nums

AC代码如下:

class Solution {
public:
int calculate(string s) {
int n = s.size();
if (n == 0) return 0;
stack<int> nums;
stack<char> ops;
for (int i = 0; i < n;){
if (s[i] >= '0' && s[i] <= '9'){
int num = s[i] - '0';
int j = i + 1;
for (; j < n; ++j){
if (s[j] >= '0' && s[j] <= '9'){
num = num * 10 + (s[j] - '0');
}
else{
i = j;
break;
}
}
if (j == n) i = n;
nums.push(num);
}
else{
if (s[i] == '+' || s[i] == '-' || s[i]=='('){
ops.push(s[i]);
}
else if (s[i] == ')'){
stack<int> tmp_nums;
stack<char> tmp_ops;
while (ops.top() != '('){
tmp_ops.push(ops.top());
ops.pop();
tmp_nums.push(nums.top());
nums.pop();
}
ops.pop();
tmp_nums.push(nums.top());
nums.pop();
while (!tmp_ops.empty()){
char op = tmp_ops.top();
tmp_ops.pop();
int num1 = tmp_nums.top();
tmp_nums.pop();
int num2 = tmp_nums.top();
tmp_nums.pop();
if (op == '-'){
tmp_nums.push(num1 - num2);
}
else{
tmp_nums.push(num1 + num2);
}
}
nums.push(tmp_nums.top());
}
++i;
}
}
stack<int> tmp_nums;
stack<char> tmp_ops;
while (!ops.empty()){
tmp_ops.push(ops.top());
ops.pop();
}
while (!nums.empty()){
tmp_nums.push(nums.top());
nums.pop();
}
while (!tmp_ops.empty()){
char op = tmp_ops.top();
tmp_ops.pop();
int num1 = tmp_nums.top();
tmp_nums.pop();
int num2 = tmp_nums.top();
tmp_nums.pop();
if (op == '-'){
tmp_nums.push(num1 - num2);
}
else{
tmp_nums.push(num1 + num2);
}
}
return tmp_nums.top();
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息