LeetCode OJ:Basic Calculator(基础计算器)
2015-10-21 22:22
357 查看
Implement a basic calculator to evaluate a simple expression string.
The expression string may contain open
You may assume that the given expression is always valid.
Some examples:
一个基本的计算器而已,可以使用两个栈来解决,下面这个方法是参考了别人的做法,当遇到左括号的时候要先考虑括号里面的东西,所以把前面的结果全部都入栈。遇到右括号的时候将左括号之前的栈的的东西拿出来计算再次得到临时的结果。这里由于
之后有+和减号,所以可以使用sign == -1来模拟减号。 这里的res实际上也相当于一个栈的角色:
下面是java写的,不得不说java里面处理字符串的函数确实比c++要友好很多哈,代码如下所示:
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
一个基本的计算器而已,可以使用两个栈来解决,下面这个方法是参考了别人的做法,当遇到左括号的时候要先考虑括号里面的东西,所以把前面的结果全部都入栈。遇到右括号的时候将左括号之前的栈的的东西拿出来计算再次得到临时的结果。这里由于
之后有+和减号,所以可以使用sign == -1来模拟减号。 这里的res实际上也相当于一个栈的角色:
class Solution { public: int calculate(string s) { int sz = s.size(); int left, right; char optor = '0'; stack<int> tokenStk; //注意这里是int int res = 0; int sign = 1; for(int i = 0; i < sz; ++i){ if(s[i] == '+') sign = 1; else if(s[i] == '-') sign = -1; else if(isdigit(s[i])){ int tmpNum = 0; for(int j = i; j < sz; ++j){ if(isdigit(s[j])){ tmpNum *= 10; tmpNum += (s[j] - '0'); i = j; }else break; } res += sign * tmpNum; }else if(s[i] == '('){ tokenStk.push(res); res = 0; tokenStk.push(sign); sign = 1; }else if(s[i] == ')'){ int tmpSign = tokenStk.top(); tokenStk.pop(); int left = tokenStk.top(); tokenStk.pop(); res = res * tmpSign + left; sign = 1; } } return res; } };
下面是java写的,不得不说java里面处理字符串的函数确实比c++要友好很多哈,代码如下所示:
public class Solution { public int calculate(String s) { int sz = s.length(); int ret = 0; int sign = 1; int res = 0; Stack<Integer> stk = new Stack<Integer>(); for(int i = 0; i < sz; i++){ if(s.charAt(i) == '+') sign = 1; else if(s.charAt(i) == '-') sign = -1; else if(Character.isDigit(s.charAt(i))){ int beg = i; while(i+1 < sz && Character.isDigit(s.charAt(i+1))) i++; res += sign * Integer.parseInt(s.substring(beg, i+1));//将数字分割开 }else if(s.charAt(i) == '('){ stk.push(res); stk.push(sign); res = 0; sign = 1; }else if(s.charAt(i) == ')'){ int tmpSign = stk.pop(); int parLeft = stk.pop();//括号左边,也就是外面的值 res = parLeft + tmpSign * res;//暂时还是不用push的 }else//跳过空格 continue; } return res; } }
相关文章推荐
- synchronized和lock的区别
- 黑马程序员--反射
- MongoDB的基本使用
- Scala2.11.7学习笔记(六)Scala特质介绍
- 10句话读懂图像频域滤波——不能不知道的信号与系统基本理论
- 09python生成文件脚本
- pycharm ImportError: No module named caffe
- angular+bootstrap+MVC--之一,入门
- 数组与指针&冒泡排序
- vim move the cursor in a long sentence
- eclipse/myeclipse安装tomcat7服务器
- 在一个SQL Server表中的多个列找出最大值
- PHP调用WCF提供的方法
- datagrid合并行列--并不能影响序号列内容...(formatter的锅.)
- 自测-3 数组元素循环右移问题
- usaco Picture
- 构造函数
- js中innerHTML和outerHTML的相同与不同
- Ffmpeg框架结构解读
- 打印回形矩阵(C实现)