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 + 1" = 2
  2. " 2-1 + 2 " = 3
  3. "(1+(4+5+2)-3)+(6+8)" = 23

一个基本的计算器而已,可以使用两个栈来解决,下面这个方法是参考了别人的做法,当遇到左括号的时候要先考虑括号里面的东西,所以把前面的结果全部都入栈。遇到右括号的时候将左括号之前的栈的的东西拿出来计算再次得到临时的结果。这里由于

之后有+和减号,所以可以使用sign == -1来模拟减号。 这里的res实际上也相当于一个栈的角色:

  1. class Solution {
  2. public:
  3. int calculate(string s) {
  4. int sz = s.size();
  5. int left, right;
  6. char optor = '';
  7. stack<int> tokenStk; //注意这里是int
  8. int res = ;
  9. int sign = ;
  10. for(int i = ; i < sz; ++i){
  11. if(s[i] == '+')
  12. sign = ;
  13. else if(s[i] == '-')
  14. sign = -;
  15. else if(isdigit(s[i])){
  16. int tmpNum = ;
  17. for(int j = i; j < sz; ++j){
  18. if(isdigit(s[j])){
  19. tmpNum *= ;
  20. tmpNum += (s[j] - '');
  21. i = j;
  22. }else break;
  23. }
  24. res += sign * tmpNum;
  25. }else if(s[i] == '('){
  26. tokenStk.push(res);
  27. res = ;
  28. tokenStk.push(sign);
  29. sign = ;
  30. }else if(s[i] == ')'){
  31. int tmpSign = tokenStk.top();
  32. tokenStk.pop();
  33. int left = tokenStk.top();
  34. tokenStk.pop();
  35. res = res * tmpSign + left;
  36. sign = ;
  37. }
  38. }
  39. return res;
  40. }
  41. };

下面是java写的,不得不说java里面处理字符串的函数确实比c++要友好很多哈,代码如下所示:

  1. public class Solution {
  2. public int calculate(String s) {
  3. int sz = s.length();
  4. int ret = 0;
  5. int sign = 1;
  6. int res = 0;
  7. Stack<Integer> stk = new Stack<Integer>();
  8. for(int i = 0; i < sz; i++){
  9. if(s.charAt(i) == '+')
  10. sign = 1;
  11. else if(s.charAt(i) == '-')
  12. sign = -1;
  13. else if(Character.isDigit(s.charAt(i))){
  14. int beg = i;
  15. while(i+1 < sz && Character.isDigit(s.charAt(i+1)))
  16. i++;
  17. res += sign * Integer.parseInt(s.substring(beg, i+1));//将数字分割开
  18. }else if(s.charAt(i) == '('){
  19. stk.push(res);
  20. stk.push(sign);
  21. res = 0;
  22. sign = 1;
  23. }else if(s.charAt(i) == ')'){
  24. int tmpSign = stk.pop();
  25. int parLeft = stk.pop();//括号左边,也就是外面的值
  26. res = parLeft + tmpSign * res;//暂时还是不用push的
  27. }else//跳过空格
  28. continue;
  29. }
  30. return res;
  31. }
  32. }

LeetCode OJ:Basic Calculator(基础计算器)的更多相关文章

  1. [LeetCode] 224. Basic Calculator 基本计算器

    Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...

  2. LeetCode OJ Basic Calculator II

    Basic Calculator II 题目 思路 和这个一样:Basic Calculator I 代码 class ExpressionTransformation { public: strin ...

  3. [LeetCode] 227. Basic Calculator II 基本计算器 II

    Implement a basic calculator to evaluate a simple expression string. The expression string contains ...

  4. [LeetCode] Basic Calculator 基本计算器

    Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...

  5. [LeetCode] 772. Basic Calculator III 基本计算器之三

    Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...

  6. LeetCode#227.Basic Calculator II

    题目 Implement a basic calculator to evaluate a simple expression string. The expression string contai ...

  7. [leetcode]224. Basic Calculator

    Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...

  8. [LeetCode] 227. Basic Calculator II 基本计算器之二

    Implement a basic calculator to evaluate a simple expression string. The expression string contains ...

  9. Java for LeetCode 227 Basic Calculator II

    Implement a basic calculator to evaluate a simple expression string. The expression string contains ...

  10. Java for LeetCode 224 Basic Calculator

    Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...

随机推荐

  1. 剑指offer 面试10题

    面试10题: 题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.n<=39 n=0时,f(n)=0 n=1时,f(n)=1 n>1时,f(n)=f(n-1 ...

  2. vim插件快捷键

    @1:winmanager: #1:打开winmanager的快捷键在.vimrc中配置,默认为":WMToggle",使用nmap可以将其映射到其他的命令. #2:netrw快捷 ...

  3. MVC4 中使用 Area 和 注意的地方

    在MVC项目中经常会使用到Area来分开不同的模块让项目结构更加的清晰. 步骤如下:  项目 –> 添加 -> 区域 (Area)  输入 Admin 添加成功后 Area包含:创建一个空 ...

  4. 在GCE上安装Apache、tomcat等

    1.安装Apache2.2.3 (虚机的操作系统是CentOS7) sudo yum install wget -y cd /opt sudo wget http://archive.apache.o ...

  5. 对”唯一键可以包含NULL值,并且每个NULL值都是唯一的(即NULL!=NULL)“理解

    因为最近在写一篇关于字符串模糊检索的论文,开始比较细致的研究数据库(MySQL)中的index问题,变到图书馆借了本<Effective MySQL之SQL语句最优化>(Ronald Br ...

  6. HashTable的使用,扑克牌发牌游戏

    l  场景 主要实现以下功能: 1.      首先给扑克牌中每张牌设定一个编号,下面算法实现的编号规则如下:   红桃按照从小到大依次为:1-13   方块按照从小到大依次为:14-26   黑桃按 ...

  7. Jfreechart 生成不同数据源多个饼图(Multiple Pie Chart)

    http://blog.163.com/ppy2790@126/blog/static/103242241201210130736274/ 项目中要用JfreeChart实现不同数据源多个饼图展现每个 ...

  8. ubuntu里设置从串口登录

    1) Create a file called /etc/init/ttyS0.conf containing the following: # ttySAC0 - getty # # This se ...

  9. 物理分辨率与逻辑分辨率,pt与px

    有些小伙伴们,在使用chrome的移动端调试工具调试网页的时候,会发现iphone6上的尺寸为375*667,不禁差异,iphone6的分辨率不是750*1334吗? 实际上调试器上的大小单位不是px ...

  10. python爬虫之html解析Beautifulsoup和Xpath

    Beautiifulsoup Beautiful Soup 是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据.BeautifulSoup 用来解析 HTML 比较简 ...