基本计算器

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

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

示例 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快得多

 import java.util.Stack;

 public class Solution {

     public static void solve(Stack<Integer> stkNum, char op) {
int a = stkNum.peek();
stkNum.pop();
int b = stkNum.peek();
stkNum.pop();
if(op == '+') {
stkNum.push(b + a);
}
else if(op == '-') {
stkNum.push(b - a);
}
} public static String infixToSuffix(String s) {
StringBuffer sb = new StringBuffer("");
Stack<Character> stkOp = new Stack<>();
int num, len = s.length();
for(int i = 0; i < len; i ++) {
char ch = s.charAt(i);
if(ch == ' ') {
continue;
}
else if(ch == '(') {
stkOp.push(ch);
}
else if(ch == '+' || ch == '-') {
while(stkOp.size() > 0 && stkOp.peek() != '(') {
sb.append(stkOp.peek());
stkOp.pop();
}
stkOp.push(ch);
}
else if(ch == ')') {
while(stkOp.peek() != '(') {
sb.append(stkOp.peek());
stkOp.pop();
}
stkOp.pop();
}
else {
num = 0;
while(i < len && s.charAt(i) >= '0' && s.charAt(i) <= '9') {
sb.append(s.charAt(i));
i ++;
}
sb.append(' ');
i --;
}
}
return sb.toString();
} public static int calculate(String s) {
Stack<Integer> stkNum = new Stack<>();
String str = infixToSuffix('(' + s + ')');
int num = 0;
//System.out.println("str = " + str);
for(int i = 0; i < str.length(); i ++) {
if(str.charAt(i) == '+') {
solve(stkNum, '+');
}
else if(str.charAt(i) == '-') {
solve(stkNum, '-');
}
else {
num = 0;
while(str.charAt(i) != ' ') {
num = num * 10 + str.charAt(i) - '0';
i ++;
}
stkNum.push(num);
}
}
return stkNum.peek();
} public static void main(String[] args){
calculate("23+45");
}
}

Leetcode 224.基本计算器的更多相关文章

  1. Java实现 LeetCode 224 基本计算器

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

  2. Leetcode 224/227/772 计算器

    题目描述 Leetcode 224 Leetcode 224: 这里想让我们实现一个基础的计算器,来计算给定的字符串. 给定的字符串中包含 ( ) + - 和非负整数和空格. # Example 1: ...

  3. LeetCode 227. 基本计算器 II(Basic Calculator II)

    227. 基本计算器 II 227. Basic Calculator II 题目描述 实现一个基本的计算器来计算一个简单的字符串表达式的值. 字符串表达式仅包含非负整数,+,-,*,/ 四种运算符和 ...

  4. [LeetCode] 227. 基本计算器 II

    题目链接: https://leetcode-cn.com/problems/basic-calculator-ii 难度:中等 通过率:33.2% 题目描述: 实现一个基本的计算器来计算一个简单的字 ...

  5. [LeetCode] 224. Basic Calculator 基本计算器

    Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...

  6. leetcode 224. Basic Calculator 、227. Basic Calculator II

    这种题都要设置一个符号位的变量 224. Basic Calculator 设置数值和符号两个变量,遇到左括号将数值和符号加进栈中 class Solution { public: int calcu ...

  7. [leetcode]224. Basic Calculator

    Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...

  8. Leetcode 227.基本计算器II

    基本计算器II 实现一个基本的计算器来计算一个简单的字符串表达式的值. 字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格  . 整数除法仅保留整数部分. 示例 1: 输入: " ...

  9. 【LeetCode】基本计算器II

    [问题]实现一个基本的计算器来计算一个简单的字符串表达式的值.字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格  .整数除法仅保留整数部分. 输入: "3+2*2" ...

随机推荐

  1. Contextual Action bar(2) 简介,启动,各函数介绍

    一.Context Action Bar简介 它是一个ActionBar,有各种操作项,但它不是始终显示的ActionBar,它需要上下文才显示.样式如下: 二.Context Action Bar的 ...

  2. 【转】Iconfont

    Iconfont Iconfont 是指用字体文件取代图片文件,来展示图标.特殊字体等元素的一种方法.很多网站都会用它,比如手淘.新浪微博等. 在使用它之前,先来了解一下它的优缺点: 优点:(1)文件 ...

  3. subprocess模块详解2

    1.call() 和run功能类似,都是接受一个列表里的参数. >>> import subprocess >>> a = subprocess.call([&qu ...

  4. CCF|学生排队|Java

    import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Sc ...

  5. 第8章 应用协议 图解TCP/IP 详解

    第8章 应用协议 图解TCP/IP 详解 8.1 应用层协议概要 应用层协议的定义 TCP和IP等下层协议是不依赖上层应用类型.实用性非常广的协议.而应用协议则是为了实现某种应用而设计和创造的协议. ...

  6. centos系统iptables使用帮助

    #如果只是想屏蔽IP的话“开放指定的端口”可以直接跳过.#屏蔽单个IP的命令是iptables -I INPUT -s 123.45.6.7 -j DROP#封整个段即从123.0.0.1到123.2 ...

  7. 获取Java接口的所有实现类

    获取Java接口的所有实现类 前言:想看基于spring 的最简单实现方法,请直接看 第七步. 本文价值在于 包扫描的原理探究和实现 一.背景 项目开发中,使用Netty做服务端,保持长连接与客户端( ...

  8. iview table 勾选当前行代码 data key _checked: true

    给 data 项设置特殊 key _checked: true 可以默认选中当前项

  9. easyUI-datagrid属性设置display:none,表头不显示

    <div class="box1"> <div class="dg1Box" style="margin-top:15px; mar ...

  10. Bézier surface(贝塞尔曲面)

    Bézier surface(贝赛尔曲面) 贝塞尔曲面是一种用于计算机图形学.计算机辅助设计和有限元建模的数学样条.与贝塞尔曲线一样,贝塞尔曲面由一组控制点定义.与插值在许多方面相似,一个关键的区别是 ...