LeetCode OJ:Basic Calculator(基础计算器)

LeetCode OJ:Basic Calculator(基础计算器)

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实际上也相当于一个栈的角色:

 1 class Solution {
 2 public:
 3     int calculate(string s) {
 4         int sz = s.size();
 5         int left, right;
 6         char optor = '0';
 7         stack<int> tokenStk;    //注意这里是int
 8         int res = 0;
 9         int sign = 1;
10         for(int i = 0; i < sz; ++i){
11             if(s[i] == '+')
12                 sign = 1;
13             else if(s[i] == '-')
14                 sign = -1;
15             else if(isdigit(s[i])){
16                 int tmpNum = 0;
17                 for(int j = i; j < sz; ++j){
18                     if(isdigit(s[j])){
19                         tmpNum *= 10;
20                         tmpNum += (s[j] - '0');
21                         i = j;
22                     }else break;
23                 }
24                 res += sign * tmpNum;
25             }else if(s[i] == '('){
26                 tokenStk.push(res);
27                 res = 0;
28                 tokenStk.push(sign);
29                 sign = 1;
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 = 1;
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 }

 

转载于:https://www.cnblogs.com/-wang-cheng/p/4899299.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/109285.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • handlerInvocation的invoke方法

    handlerInvocation的invoke方法java.lang.reflect.Proxy类的newProxyInstance(),是用于创建动态代理类和实例的静态方法.返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。java.lang.reflect.InvocationHandler接口中的invoke(),在代理实例上处理方法调用并返回结果。当与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法…

  • Python代码画爱心_python代码画人物

    Python代码画爱心_python代码画人物用python一行代码画出爱心print(‘\n’.join([”.join([(‘LoveSongxiaolong'[(x-y)%8]if((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3&lt;=0else”)forxinrange(-30,30)])foryinrange(15,-15,-1)]))结果为:…

  • java 集成测试_javadbf.jar

    java 集成测试_javadbf.jar0、pom.xml依赖<!–LMDB–> <dependency> <groupId>org.lmdbjava</groupId> <artifactId>lmdbjava</artifactId> <version>0.7.0</version> </dependency>1、application.properties配置:#maven多环境打包的支持l

  • Pytorch 转置卷积

    Pytorch 转置卷积环境使用Kaggle里免费建立的Notebook教程使用李沐老师的动手学深度学习网站和视频讲解小技巧:当遇到函数看不懂的时候可以按查看函数详解。卷积不会增大输入的高和宽,通常要么不变,要么减半。而转置卷积则可以用来增大输入高宽。假设忽略通道,步幅为1且填充为0。输入张量形状为nh×nwn_h\timesn_wnh​×nw​,卷积核形状为kh×kwk_h\timesk_wkh​×kw​。共产生nhnwn_hn_wnh​nw​个中间结果。每个中间结果都是一个(nh+k

  • javac使用「建议收藏」

    javac使用「建议收藏」javac使用

  • 原生小程序使用 flyio,以及拦截器

    原生小程序使用 flyio,以及拦截器原生小程序的request请求都是异步请求,在实际项目中使用起来很麻烦,自己封装的方法又不够用,所以想到了flyio,不仅可以实现Promise,而且还可以对所有的页面请求进行拦截,使用起来非常的方便。第一件事首先也是先引用flyio.js了。下载地址:flyio.js在utils目录新建http.jsvarFly=require("flyio.js")//引入路径根据自…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号