zoukankan      html  css  js  c++  java
  • Leetcode 224.基本计算器

    基本计算器

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

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

    示例 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 }
  • 相关阅读:
    myeclipse中无自动提示
    ueditor使用方法
    微软开发中心的rss历史记录(10)
    微软开发中心的rss历史记录(9)
    微软开发中心的rss历史记录(6)
    微软开发中心的rss历史记录(7)
    微软开发中心的rss历史记录(8)
    P4学习:统计功能
    openCL信息汇总
    GPU/CUDA程序初体验 向量加法
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10203072.html
Copyright © 2011-2022 走看看