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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C6000汇编语言实现乘法,C6000(四)-汇编.ppt[通俗易懂]

    C6000汇编语言实现乘法,C6000(四)-汇编.ppt[通俗易懂]C6000(四)-汇编BIT/TI第四讲汇编语言初步第四讲汇编语言初步目的:用汇编语言编写简单程序学习内容汇编代码的结构汇编程序的构成编写简单算法:y=mx+b一、汇编代码的构成label:||[cond]instruction.unitoperand;comment常用伪指令二、汇编程序的构成程序=数据结构+算法汇编程序…

    2022年6月23日
    26
  • 线程池面试题一般会怎么问?线程池面试题总结及答案整理

    线程池面试题一般会怎么问?线程池面试题总结及答案整理对于广大程序员来说,线程池一定不会陌生,因为大部分程序员面试时总会被问到关于线程池的问题,今天总结了一些关于线程池的各种面试可能问到的题目,希望对大家有所帮助。一、线程池是什么?答:线程池,是一种多线程处理形式,在处理过程中将任务添加到队列中,然后在创建线程后自动启动这些任务。比如把线程池看成一个容器,集中管理线程。线程使用完不会销毁,会先储存在线程池中。二、线程池有几种?答:常见的线程池有四种。newCachedThreadPool创建一个可缓存的线程池,如果线程池长度超过处理需要,

    2022年5月5日
    48
  • MongoDB和MySQL和Redis的区别

    MongoDB和MySQL和Redis的区别MongoDB和MySQL和Redis的区别MySQL1、在不同的引擎上有不同的存储方式。2、查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高。3、开源数据库的份额在不断增加,mysql的份额页在持续增长。4、缺点就是在海量数据处理的时候效率会显著变慢。MongoDBMongodb是非关系型数据库(nosql),属于文档型数据库。文档是mongoDB中数据的基本单元,类似关系数据库的行,多个键值对有序地放置在一起便是文档,语法有点类似javascript面向对象的查询语言,

    2022年6月26日
    26
  • 2022年 2月19运维面试题

    2022年 2月19运维面试题 

    2022年5月30日
    30
  • ubuntu16.04安装cuda9.0(ubuntu18安装nvidia驱动)

    (安装:NVIDIA-384+CUDA9.0+cuDNN7.1)Ubuntu下安装CUDA需要装NVIDIA驱动,首先进入NVIDIA官网,然后查询对应NVIDIA驱动是否支持你电脑的型号。第一步、安装NVIDIAGPU驱动去NVIDIA官网查询是否支持我电脑的GPU如下&amp;nbsp;可以看出:GeForce700MSeries(Notebooks):GeForceGTX…

    2022年4月14日
    64
  • An overview of the Web(Web概述)

    An overview of the Web(Web概述)

    2021年6月8日
    102

发表回复

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

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