基本计算器

实现一个基本的计算器来计算一个简单的字符串表达式的值。

字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格  。

示例 1:

输入: "1 + 1"

输出: 2

示例 2:

输入: " 2-1 + 2 "

输出: 3

示例 3:

输入: "(1+(4+5+2)-3)+(6+8)"

输出: 23

说明:

  • 你可以假设所给定的表达式都是有效的。
  • 不要使用内置的库函数 eval。

题目分析:最中规中矩的做法就是,先中缀表达式转后缀表达式,然后根据后缀表达式计算答案,Java跑了100ms,算是很慢了,中缀转后缀的方法是:

1.若为数字直接加到后面

2.若为'(',入符号栈

3.若为运算符,则将优先级大于等于它的运算符先弹出并记录带答案,再将其入栈,本题运算符只有+,-,优先级相同

4.若为')',弹出运算符直到遇到'('

因为可能存在不止1位的数字,所以用一个空格来区分,还有就是连字符串的时候StringBuffer要比String快得多

 1 import java.util.Stack;
 2
 3 public class Solution {
 4
 5     public static void solve(Stack<Integer> stkNum, char op) {
 6         int a = stkNum.peek();
 7         stkNum.pop();
 8         int b = stkNum.peek();
 9         stkNum.pop();
10         if(op == '+') {
11             stkNum.push(b + a);
12         }
13         else if(op == '-') {
14             stkNum.push(b - a);
15         }
16     }
17
18     public static String infixToSuffix(String s) {
19         StringBuffer sb = new StringBuffer("");
20         Stack<Character> stkOp = new Stack<>();
21         int num, len = s.length();
22         for(int i = 0; i < len; i ++) {
23             char ch = s.charAt(i);
24             if(ch == ' ') {
25                 continue;
26             }
27             else if(ch == '(') {
28                 stkOp.push(ch);
29             }
30             else if(ch == '+' || ch == '-') {
31                 while(stkOp.size() > 0 && stkOp.peek() != '(') {
32                     sb.append(stkOp.peek());
33                     stkOp.pop();
34                 }
35                 stkOp.push(ch);
36             }
37             else if(ch == ')') {
38                 while(stkOp.peek() != '(') {
39                     sb.append(stkOp.peek());
40                     stkOp.pop();
41                 }
42                 stkOp.pop();
43             }
44             else {
45                 num = 0;
46                 while(i < len && s.charAt(i) >= '0' && s.charAt(i) <= '9') {
47                     sb.append(s.charAt(i));
48                     i ++;
49                 }
50                 sb.append(' ');
51                 i --;
52             }
53         }
54         return sb.toString();
55     }
56
57     public static int calculate(String s) {
58         Stack<Integer> stkNum = new Stack<>();
59         String str = infixToSuffix('(' + s + ')');
60         int num = 0;
61         //System.out.println("str = " + str);
62         for(int i = 0; i < str.length(); i ++) {
63             if(str.charAt(i) == '+') {
64                 solve(stkNum, '+');
65             }
66             else if(str.charAt(i) == '-') {
67                 solve(stkNum, '-');
68             }
69             else {
70                 num = 0;
71                 while(str.charAt(i) != ' ') {
72                     num = num * 10 + str.charAt(i) - '0';
73                     i ++;
74                 }
75                 stkNum.push(num);
76             }
77         }
78         return stkNum.peek();
79     }
80
81     public static void main(String[] args){
82         calculate("23+45");
83     }
84 }

转载于:https://www.cnblogs.com/kexinxin/p/10203072.html

Leetcode 224.基本计算器相关推荐

  1. LeetCode 224. 基本计算器

    224. 基本计算器 [双栈]nums用来存数,ops用来存符号. 1.预处理:把所有空格去掉,在前面加个'0',防止出现 -1 + 2 这种样例. 2.遍历 (1)遇到 '(' 直接压入ops. ( ...

  2. leetcode 224. 基本计算器(栈)

    给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值. 示例 1: 输入:s = "1 + 1" 输出:2 示例 2: 输入:s = " 2-1 + 2 ...

  3. 数据结构与算法 | LeetCode 224. Basic Calculator

    原文链接:https://wangwei.one/posts/alg... 前面,我们学习了 栈的实现及其应用 ,今天我们基于栈,来实现一个简单的计算器功能. 简单计算器实现 Leetcode 224 ...

  4. 【一天一道Leetcode】基本计算器的延伸问题

    本篇推文共计2000个字,阅读时间约3分钟. 01 题目描述 题目描述: 给你一个字符串表达式s,请你实现一个基本计算器来计算并返回它的值. 整数除法仅保留整数部分. 示例: 输入:s = " ...

  5. leetcode 224. Basic Calculator | 224. 基本计算器(中缀表达式求值)

    题目 https://leetcode.com/problems/basic-calculator/ 题解 中缀表达式求值,之前学数据结构的笔记: class Solution {public int ...

  6. 【LeetCode - 224】基本计算器(栈)

    实现一个基本的计算器来计算一个简单的字符串表达式 s 的值. 题目链接:https://leetcode-cn.com/problems/basic-calculator/ 示例 1: 输入:s = ...

  7. leetcode 227. 基本计算器 II(栈)

    给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值. 整数除法仅保留整数部分. 示例 1: 输入:s = "3+2*2" 输出:7 解题思路 利用两个栈,一个记录 ...

  8. 力扣—— 224. 基本计算器(困难)

    目录 题目描述 题目分析 c++代码 题目描述 给你一个字符串表达式s,请你实现一个基本的计算器来返回它的值.注意不允许使用任何将字符串作为数学表达式计算的内置函数,比如:eval(). 示例一: 输 ...

  9. leetcode 手写计算器 方法总结

    1.leetcode 227 Basic calculator 我目前见过的最好的解法 Implement a basic calculator to evaluate a simple expres ...

  10. 224. 基本计算器

    实现一个基本的计算器来计算一个简单的字符串表达式的值. 字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格  . 示例 1: 输入: "1 + 1" ...

最新文章

  1. 2018-2019-1 20165226 《信息安全系统设计基础》第4周学习总结
  2. 不动的,稳定的,有序的东西就是低熵,相反的就是动的,不稳定的
  3. 总结20121016
  4. Visual Studio 2017 最新全量离线下载方法[有惊喜]
  5. mini2440驱动分析之LCD
  6. webstorm使用gitee_webstorm 中 git 基本操作
  7. html 自适应单位vw,CSS单位em、rem、vh和vw等及CSS3的calc()以及line-height百分比
  8. CleanCodeHandbook Chapter 5: Bit Manipulation(33-34)
  9. 团队开发之个人博客八(4月27)
  10. php twig输出html,php – HTML不呈现[Twig] / [Slim]
  11. 《菜菜的机器学习sklearn课堂,孔浩Java视频百度云盘
  12. ActiveMQ 反序列化漏洞 (CVE-2015-5254)
  13. 蓝桥杯 2019年号字串
  14. iPhoneSE4完虐国产手机,国产旗舰手机还有啥遮羞布?
  15. STM32 定时器主从模式,上电立即输出脉冲,输出有尖刺,解决方法
  16. Windows11输入法第一个候选词不显示。
  17. 中国大学慕课C语言第六讲作业
  18. JS学习手册十五 事件处理
  19. 【愚公系列】2021年12月 网络工程-虚拟网络
  20. 【面经】迅游、深科技(长城开发)——C++开发

热门文章

  1. ubuntu,装完PYTHON3 pip3 install 报错
  2. linux io ports io memory
  3. 猫叫了,老鼠跑了!(复习委托和事件)
  4. uva 10246(变形floyd)
  5. WCF服务部署到IIS上,然后通过web服务引用方式出现错误的解决办法
  6. 波形捕捉:(3)捕捉设备性能
  7. idea code key study form qinChao
  8. 炸了!!又一 VSCode 神器面世!
  9. 微信红包技术架构首次流出,贼牛逼啊!
  10. 架构篇:高可用 Redis 服务架构分析与搭建