LeetCode(224) Basic Calculator
2015-12-09 14:00
176 查看
题目
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.
分析
简易计算器的实现。需要两个栈,一个存放操作数,另一个存放操作符。
注意事项:
加减法没有交换律,每个操作数入栈时,都需查看操作符栈若有 + 或 - ,立即计算更新两个栈。
当遇到)时,将当前()内的表达式计算结果入栈,同时检查操作符栈若有 + 或 - ,立即计算更新两个栈。
AC代码
class Solution { public: int calculate(string s) { if (s.empty()) return 0; //求出所给表达式的长度 int len = s.length(); //操作符栈 stack<char> op_stack; //操作数栈 stack<int> num_stack; for (int i = 0; i < len; ++i) { //(1) 跳过空格 if (s[i] == ' ') continue; //(2) 操作符入栈 else if (s[i] == '(' || s[i] == '+' || s[i] == '-') { op_stack.push(s[i]); continue; }//elif //(3) 右括号 else if (s[i] == ')') { while (op_stack.top() != '(') { //从数据栈弹出两个操作数 int num2 = num_stack.top(); num_stack.pop(); int num1 = num_stack.top(); num_stack.pop(); //从符号栈,弹出操作符 char op = op_stack.top(); op_stack.pop(); if (op == '+') num_stack.push(num1 + num2); else if (op == '-') num_stack.push(num1 - num2); }//while //弹出左括号 op_stack.pop(); //此时查看操作数和操作符栈 while (!op_stack.empty() && op_stack.top() != '(') { //从数据栈弹出两个操作数 int num2 = num_stack.top(); num_stack.pop(); int num1 = num_stack.top(); num_stack.pop(); //从符号栈,弹出操作符 char op = op_stack.top(); op_stack.pop(); if (op == '+') num_stack.push(num1 + num2); else if (op == '-') num_stack.push(num1 - num2); }//while }//elif else{ int num = 0; while (i < len && isDigit(s[i])) { num = num * 10 + (s[i] - '0'); i++; }//while //回退一个字符 --i; num_stack.push(num); //此时查看操作数和操作符栈 while (!op_stack.empty() && op_stack.top() != '(') { //从数据栈弹出两个操作数 int num2 = num_stack.top(); num_stack.pop(); int num1 = num_stack.top(); num_stack.pop(); //从符号栈,弹出操作符 char op = op_stack.top(); op_stack.pop(); if (op == '+') num_stack.push(num1 + num2); else if (op == '-') num_stack.push(num1 - num2); }//while } }//for return num_stack.top(); } bool isDigit(char c) { if (c >= '0' && c <= '9') return true; else return false; } };
GitHub测试程序源码
相关文章推荐
- Android多点触摸交互处理-图片缩放
- LeetCode(224) Basic Calculator
- LINUX内核中编写procfs
- Automatic Preferred Max Layout Width before iOS8.0 解决探索
- sqlplus登录Oracle时ORA-01017: invalid username/password; logon denied的错误
- Java判断一个字符串能否在顺序重组后成为回文串
- Maven实战(六)依赖
- SuperMap公交换乘分析过程全解析
- db2 连接 ERRORCODE=-4499, SQLSTATE=08001,解决办法
- 类目,延展,协议
- Art & Material
- hammer使用: 代码:捏合、捏开、图片放大 的一个手机图片“放大缩小可拖动”的小效果
- Android中Service(服务)详解
- 【Java】不用循环语句如何输入打印数组元素
- String^与string的相互转换
- 【LeetCode】 Largest Rectangle in Histogram O(n) 解法详析
- C# 关于方法中的参数(可选参数和命名参数)
- CSS中的数量查询
- 教学产品设计
- Visual Studio控制台程序输出窗口一闪而过的解决方法