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. excel同时冻结首行和首列怎么操作

    之前ytkah只知道excel可以冻结首行或首列,但还不清楚如何同时冻结excel首行和首列,后面看到小C的报表,问了他才明白怎么操作. 首先,我们先把选中B2单元格,点击导航菜单的“视图” - “冻 ...

  2. springboot整合 Thymeleaf模板

    首先引入maven jar依赖 <dependency> <groupId>org.springframework.boot</groupId> <artif ...

  3. JavaScript+css+ div HTML遮罩層效果

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Test</title ...

  4. jQuery EasyUI - 数据表格(DataGrid)

    由于工作需要,项目使用前端 jQuery EasyUI - DataGrid 来控制数据表格. 1.加载相关js和css,因为easyui依赖jquery,所有加载easyui前要先加载jquery, ...

  5. PictureBox 双缓冲防止闪屏

    Bitmap bm = new Bitmap(this.pbTraffic.Image); BufferedGraphicsContext current = BufferedGraphicsMana ...

  6. image has dependent child images

    在删除镜像之前要先用 docker rm 删掉依赖于这个镜像的所有容器(哪怕是已经停止的容器),否则无法删除该镜像. 停止容器 # docker stop $(docker ps -a | grep ...

  7. Ubuntu 16.04 php卸载

    1.卸载 apache2 sudo apt-get --purge remove apache2* sudo apt-get autoremove apache2 (--purge 是完全删除并且不保 ...

  8. 转:ADO,OLEDB,ODBC,DAO的区别

    ODBC(Open Database Connectivity,开放数据库互连) 1992年,微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有 ...

  9. 计算机网络概述 传输层 TCP可靠传输的实现

    TCP可靠传输的实现 TCP的可靠性表现在:它向应用层提供的数据是 无差错的.有序的.无丢失的,简单的说就是:TCP最终递交给应用层的数据和发送者发送的数据是一模一样的. TCP采用了流量控制.拥塞控 ...

  10. Linux环境下的图形系统和AMD R600显卡编程(2)——Framebuffer、DRM、EXA和Mesa简介

    转:https://www.cnblogs.com/shoemaker/p/linux_graphics02.html 1. Framebuffer Framebuffer驱动提供基本的显示,fram ...