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)


相关推荐

  • 【实用软件】局域网传输神器-LANDrop[通俗易懂]

    【实用软件】局域网传输神器-LANDrop[通俗易懂]软件介绍LANDrop是一款开源免费的支持跨平台的「局域网文件传输工具」 它的使用体验上可以媲美苹果生态的“隔空投送”功能! 能超级快速方便地将各种设备上的照片、视频、文档、文件发送到别的设备去软件功能LANDrop完全依靠局域网WIFI进行无线传输,速度极快 而且这款软件完全免费,并不限制任何平台 即便发送体积巨大的视频文件也完全没有问题,比起使用微信、QQ、网盘更加方便,速度更快,也不必担心图片/视频画质被压缩的烦恼下载地址下载地址https://url37.ctfile

  • java对象转json字符串方法_oracle clob转字符串

    java对象转json字符串方法_oracle clob转字符串曾今遇到一个问题,需要将JavaBean转换为Json字符串,用fastjson可以很方便的做到。但是得到的结果是JavaBean成员变量的首字母编程了小写。经过查找资料,原来我们可以使用fastjson的@JsonField注解来自定义json中key的值,这样看来还是很方便的。

  • 用批处理文件阻止win10强制更新

    用批处理文件阻止win10强制更新win10这个商业巨头微软的最新之作,以流氓行径著称,尤其是它的自动更新最受诟病。用户无权选择是否下载和安装更新。你选择不更新,他就在后台下载,下次开机自动安装。何况,这些更新有的没必要,有的装上反而起副作用。我之前就被装上的更新弄坏网卡驱动,重装一次系统;今年3月大范围爆发的更新bug,导致众多用户USB驱动坏掉,又重装一次系统。再后来,我知道了更新的危害,就每天手动删除那些更新安装包,结果有一…

  • 《FFmpeg从入门到精通》读书笔记(一)

    《FFmpeg从入门到精通》读书笔记(一)写在前面最近在读《FFmpeg从入门到精通》这本书,结合着雷神的博客,学习音视频的知识~在学习的过程中,也记录了一些摘要。因为是边看边记的,所以一些要点在看到后面的时候,需要反过来整理前面的。我用有道云笔记写的markdown没法加图片,所以就先把这部分发了出来。后续会针对内容和排版一步步的优化,如果你被这凌乱的内容辣到了眼睛,请谅解哈哈哈~2019.06.18第一章+第二章知识点(未…

  • quotename mysql,我如何在mySQL中创建一个QUOTENAME函数

    quotename mysql,我如何在mySQL中创建一个QUOTENAME函数IwouldliketocreateaQUOTENAME()functioninmySQLliketheonethatexistsinM$SQLServer.Thisiswhatitdoes:QUOTENAMEreturnsaUnicodestringwiththedelimitersaddedtomaketheinputstr…

  • python执行测试用例_java的random生成随机数

    python执行测试用例_java的random生成随机数前言通常我们认为每个测试用例都是相互独立的,因此需要保证测试结果不依赖于测试顺序,以不同的顺序运行测试用例,可以得到相同的结果。pytest默认运行用例的顺序是按模块和用例命名的ASCII编码

发表回复

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

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