Basic Calculator
2016-05-26 21:34
525 查看
题目描述:
Implement a basic calculator to evaluate a simple expression string.
The expression string may contain open
the plus
and empty spaces .
You may assume that the given expression is always valid.
Some examples:
Note: Do not use the
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();
}
};
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
evalbuilt-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();
}
};
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性