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

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

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

 class Solution {
public:
int calculate(string s) {
int sz = s.size();
int left, right;
char optor = '';
stack<int> tokenStk; //注意这里是int
int res = ;
int sign = ;
for(int i = ; i < sz; ++i){
if(s[i] == '+')
sign = ;
else if(s[i] == '-')
sign = -;
else if(isdigit(s[i])){
int tmpNum = ;
for(int j = i; j < sz; ++j){
if(isdigit(s[j])){
tmpNum *= ;
tmpNum += (s[j] - '');
i = j;
}else break;
}
res += sign * tmpNum;
}else if(s[i] == '('){
tokenStk.push(res);
res = ;
tokenStk.push(sign);
sign = ;
}else if(s[i] == ')'){
int tmpSign = tokenStk.top();
tokenStk.pop();
int left = tokenStk.top();
tokenStk.pop();
res = res * tmpSign + left;
sign = ;
}
}
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;
}
}

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. github 上 机器学习 的库推荐列表

    awesome-machine-learning: https://github.com/josephmisiti/awesome-machine-learning

  2. 简单springmvc在Eclipse的Tomcat上部署404error,直接在Tomcat上部署可以访问

    在Eclipse工程下的.setting文件夹的org.eclipse.wst.common.component这个文件,如下则可以访问: <?xml version="1.0&quo ...

  3. set去重,session,cookie c#与python 对比

    端口,发送请求进行监听,然后处理 session 是存储在服务器端的数据,靠sessionId来验证获取信息,没有大小和类型限制, cookie   是存储在客户端的数据,可以长期使用,有面临被获取的 ...

  4. 解释一下python中的继承

    当一个类继承另一个类,它就被称为一个子类/派生类,继承父类/基类/超类.它会继承/获取所有类成员(属性和方法) 继承能让我们重新使用代码,也能更容易的创建和维护应用 单继承:一个类继承单个基类 多继承 ...

  5. Centos6.6安装mysql记录

    一.环境介绍: 系统:Cerntos6.6 Mysql版本:mysql-5.6.34 二.安装操作: 1.卸载旧版本: rpm -qa |grep mysql mysql-server-5.1.73- ...

  6. 每天一个Linux命令(46)ifconfig命令

    在windows系统中,ipconfig命令行工具被用来获取网络接口配置信息并对此进行修改.Linux系统拥有一个类似的工具,也就是ifconfig(interfaces config).     ( ...

  7. 40个你可能不知道的Python的特点和技巧

    1.拆箱 >>> a, b, c = 1, 2, 3 >>> a, b, c (1, 2, 3) >>> a, b, c = [1, 2, 3] ...

  8. 【leetcode刷题笔记】Restore IP Addresses

    Given a string containing only digits, restore it by returning all possible valid IP address combina ...

  9. Windows系统 本地文件如何复制到远程服务器

    很多人在使用远程服务器的时候往往要将本地的文件传输到远程服务器内,方法有很多种,下面介绍下如何使用Windows自带的远程桌面连接程序将文件复制到远程服务器内. 1.首先,点击windows开始按钮, ...

  10. 网络安全-跨站脚本攻击XSS(Cross-Site Scripting)

    一.XSS攻击简介 作为一种HTML注入攻击,XSS攻击的核心思想就是在HTML页面中注入恶意代码,而XSS采用的注入方式是非常巧妙的. 在XSS攻击中,一般有三个角色参与:攻击者.目标服务器.受害者 ...