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. (扫盲)WebSocket 教程

    原文地址:http://www.ruanyifeng.com/blog/2017/05/websocket.html WebSocket 是一种网络通信协议,很多高级功能都需要它. 本文介绍 WebS ...

  2. hadoop学习第七天-HBase的原理、安装、shell命令

    一. hbase的原理知识 1. hbase介绍 hbase是hadoop的一个重要成员,主要用于存储结构化数据,构建在hdfs之上的分布式存储系统,它主要通过横向扩展,通用不断增加廉价服务器增加计算 ...

  3. 2.5 使用ARDUINO做主控,手机发送短信控制开关LED

    需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...

  4. (from) Javascript 生成指定范围数值随机数

    from:http://blog.csdn.net/ilibaba/article/details/3741786 查手册后才知道, 介绍的信息少得可怜呐, 没有介绍生成 m-n 范围的随机数..., ...

  5. Python框架之Tornado(概述)

    本系列博文计划: 1.剖析基于Python的Web框架Tornado的源码,为何要阅读源码? Tornado 由前 google 员工开发,代码非常精练,实现也很轻巧,加上清晰的注释和丰富的 demo ...

  6. Loadrunner脚本篇——从文件中读取内容并参数化

    直接代码展示: char* testfn() { int count, total = 0; char * buffer = NULL; int filelenth = 0; long file_st ...

  7. 转:USB枚举

  8. 20145230《java学习笔记》第九周学习总结

    20145230 <Java程序设计>第9周学习总结 教材学习内容 JDBC JDBC简介 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作, ...

  9. GCC编译器入门[转载]

    GCC编译器(GNU C Compiler)是GNU组织的一款开源 编译器,它是Linux环境下的默认C语言编译器.它处理能够高效的编译C语言以外,还可以编译其他语言.并且,现在的GCC已经不光包括编 ...

  10. 九度oj-题目1103:二次方程计算器

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2799 解决:633 题目描述: 设计一个二次方程计算器 输入: 每个案例是关于x的一个二次方程表达式,为了简单,每个系数都是整数形式. 输 ...