基本计算器

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

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

示例 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. 145 Binary Tree Postorder Traversal 二叉树的后序遍历

    给定一棵二叉树,返回其节点值的后序遍历.例如:给定二叉树 [1,null,2,3],   1    \     2    /   3返回 [3,2,1].注意: 递归方法很简单,你可以使用迭代方法来解 ...

  2. sublime的几款实用插件

    1.CSScomb 用于调整css属性的书写顺序 2.Emmet 缩写神器 3.HTML/CSS/JS Prettify 代码格式化 4.Trimmer 去空格去空行 5.Alignment 代码对齐 ...

  3. AWK整理

    处理模式: awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作.如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如 ...

  4. linux给文件或目录添加apache权限

    系统环境:ubuntu11.10/apache2/php5.3.6 在LAMP环境中,测试一个简单的php文件上传功能时,发现/var/log/apache2/error.log中出现如下php警告: ...

  5. 使用json传输数组实例

    client.php <?php //遍历数组元素,并将元素转码 function array_iconv($data, $in_charset='GBK', $out_charset='UTF ...

  6. 在linux中使用多个redis端口来构建redis集群

    大家好,这是我制作的redis集群搭建视频教程. 服务器:ubnutu server(版本18.10) redis:redis-4.0.12 我这里就简单说明下大概步骤了,详细请观看教学视频. 首先更 ...

  7. 2019/05/11 Java内存结构

    1.  类加载子系统:负责从文件系统或者网络加载Class信息,加载的信息存放在一块称之方法区的内存空间. 2.  方法区:就是存放类的信息.常量信息.常量池信息.包括字符串字面量和数字常量等. 3. ...

  8. hihocoder1736 最大的K-偏差排列

    思路: 容易写错的贪心题. 实现: #include <bits/stdc++.h> using namespace std; int main() { int n, k; while ( ...

  9. ios 苹果原生系统定位 CLLocationManager

    首先要干这些事 下面的方法亲测可用 ------------------------------------------------------------ DNLogFUNC //初始化位置管理对象 ...

  10. 安卓自定义View教程目录

    基础篇 安卓自定义View基础 - 坐标系 安卓自定义View基础 - 角度弧度 安卓自定义View基础 - 颜色 进阶篇 安卓自定义View进阶 - 分类和流程 安卓自定义View进阶 - Canv ...