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


相关推荐

  • java 设置400错误_Java项目报400错误的原因与解决方法

    java 设置400错误_Java项目报400错误的原因与解决方法java项目中400错误介绍:(推荐:java视频教程)400BadRequest:请求中的语法错误。Reason-Phrase应当标志这个详细的语法错误,比如”MissingCall-IDheaderfield”。HTTP400错误-请求无效(Badrequest)在ajax请求后台数据时有时会报HTTP400错误-请求无效(Badrequest);出现这个请…

    2022年9月26日
    1
  • WPF 入门教程WrapPanel介绍「建议收藏」

    WPF 入门教程WrapPanel介绍「建议收藏」WrapPanel将定位每个子控件的旁边,另外,水平方向(默认值)或垂直,直到没有更多的空间,在那里将换到下一行,然后继续。当您想要一个垂直或水平列表控件在没有更多空间时自动换行时使用它。当WrapPanel使用Horizo​​ntal方向时,子控件将被赋予相同的高度,基于最高的项目。当WrapPanel为垂直方向时,子控件将被赋予相同的宽度,基于最宽的项目。在第一个示例中,我们将检查具有默认(水平)方向的WrapPanel:<Windowx:Class=”WpfTu

    2022年7月23日
    10
  • Java集合Stream类filter的使用

    Java集合Stream类filter的使用之前的Java集合中removeIf的使用一文写了使用removeIf来实现按条件对集合进行过滤。这篇文章使用同样是JDK1.8新加入的Stream中filter方法来实现同样的效果。

    2022年6月12日
    50
  • mysql高可用集群搭建_盗版云熙软件安装教程

    mysql高可用集群搭建_盗版云熙软件安装教程本文仅为官方文件之翻译MySQL集群硬件,软件,网络要求MySQL集群的一个强悍的地方在于它可以运行在普通的硬件上,不需要太大容量的内存(因为所有的活动数据都存储在内存)。(使用磁盘数据表可以减少这样的要求,更多内容请看Section18.5.12,“MySQLClusterDiskDataTables”)多核和更快的CPU可以加强性能。自然的,集群进程对内存的需求也就相应变小。

    2022年10月9日
    3
  • java linkedhashset_Java LinkedHashSet「建议收藏」

    java linkedhashset_Java LinkedHashSet「建议收藏」JavaLinkedHashSet1什么是JavaLinkedHashSetJavaLinkedHashSet类实现了Set接口。并且HashSet的子类。关于JavaLinkedHashSet类的核心要点是:JavaLinkedHashSet类不能存储重复元素,和HashSet相似。JavaLinkedHashSet类提供所有Set接口的操作,并允许空元素。JavaLinkedH…

    2022年10月12日
    1
  • get请求最大长度限制多少k_get请求大小限制多少

    get请求最大长度限制多少k_get请求大小限制多少原来:&lt;ahref="rejectedaddrmsginfo.jsp?sender=&lt;%=URLEncoder.encode(rec.getRejectedAddr())%&gt;&amp;senderType=&lt;%=senderType%&gt;&amp;receiverType=1target="_blank"&gt;Detail&lt;/a&gt;修改后:&a

    2022年8月24日
    7

发表回复

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

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