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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 人工智能猴子摘香蕉问题状态过程_人工智能原理猴子吃香蕉问题

    人工智能猴子摘香蕉问题状态过程_人工智能原理猴子吃香蕉问题题目:利用一阶谓词逻辑求解猴子摘香蕉问题:房内有一个猴子,一个箱子,天花板上挂了一串香蕉,其位置如图1所示,猴子为了拿到香蕉,它必须把箱子搬到香蕉下面,然后再爬到箱子上。请定义必要的谓词,列出问题的初始化状态(即下图所示状态),目标状态(猴子拿到了香蕉,站在箱子上,箱子位于位置b)。(附加:从初始状态到目标状态的谓词演算过程。)1.定义描述环境状态的谓词。AT(x,w):x在w处,个体域:x?{monkey},w?{a,b,c,box};HOLD(x,t):x手中拿着t,个体域:t?{box,ba

    2022年9月26日
    4
  • 腾讯 OCR 情况

    腾讯 OCR 情况

    2021年6月14日
    154
  • android一键 iphone,安卓手机一键变“iPhone”,这种App太过分了

    android一键 iphone,安卓手机一键变“iPhone”,这种App太过分了原标题:安卓手机一键变“iPhone”,这种App太过分了最近有小伙伴问小雷,如何才能在安卓手机上使用iOS的桌面。让整个手机看起来更加清爽整洁。想让苹果手机变得“卓里卓气”可能有点麻烦,但是如果是安卓手机想变成iOS风格,那是分分钟就能搞定的事情。今天小雷就给大家推荐一款能够随意更换主题UI的实用软件——【XLauncherPro】。这是一款模仿iPhone手机界面的应用,有了它可以让手机界…

    2022年5月9日
    61
  • 撸一个简易聊天室,不信你学不会实时消息推送(附源码)

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 作者:糊糊糊糊糊了 www.cnblogs.com/rynxiao/p/13825438.html 分不清轮询、长轮…

    2021年6月26日
    109
  • kubernetes使用secrets保存敏感信息

    kubernetes使用secrets保存敏感信息

    2021年5月15日
    138
  • 通过QXDM锁BAND_不root怎么锁band

    通过QXDM锁BAND_不root怎么锁band1、通过QXDM锁频QXDM工具View->New->Common->NVBrowser:NV(NonVoliatile)参数就是保存在终端上的非易失参数,可以通过view中的NVBrowser来进行查看和修改。这些信息由厂家固化在终端内部,一般不允许用户修改。同时,可以通过NVBrowser对终端进行Offline(掉电重启)操作。其中06828LTEBCconfig可以配置终端支持的band信息,将该项的值读出来(默认读出来为十进制)转化为二进制,..

    2022年9月28日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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