• 力扣算法:基本计算器Ⅱ


    原题链接:https://leetcode-cn.com/problems/basic-calculator-ii

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

    字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格  。 整数除法仅保留整数部分。

    示例 1:

    输入: "3+2*2"
    输出: 7
    示例 2:

    输入: " 3/2 "
    输出: 1
    示例 3:

    输入: " 3+5 / 2 "
    输出: 5
    说明:

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

    解题思路:首先根绝已有中缀表达式转换为后缀表达式,之后再根据后缀表达式求值即可。

    1.转化为后缀表达式

      首先准备一个栈用来储存字符,另一个链表存储后缀表达式。遇到数字直接放到表达式中,遇到字符的时候,如果栈空则入栈,不空的话和栈顶比较,将大于等于该字符的内容出栈并存到表达式中。

    2.后缀表达式求值

      这个比较容易,数字入栈,遇到字符计算即可。

    源码如下:

    public int calculate(String s) {
            LinkedList<String> houzhui = new LinkedList<>(); //后缀表达式栈
            Stack<Character> charStack = new Stack<>();
            int start = 0;
            for(int i=0; i<s.length();i++) {
                char c = s.charAt(i);
                if (c=='+'||c=='-'||c=='*'||c=='/') {
                    houzhui.add(s.substring(start,i).trim());
                    start=i+1;
                    if(!charStack.isEmpty()&&(c=='*'||c=='/')){
                        while(!charStack.isEmpty()&&(charStack.peek()=='*'||charStack.peek()=='/'))
                            houzhui.add(charStack.pop().toString());
    
                    }
    
                    if(!charStack.isEmpty()&&(c=='+'||c=='-')){
                        while (!charStack.isEmpty())
                            houzhui.add(charStack.pop().toString());
                    }
                    charStack.add(c);
    
                }
            }
            houzhui.add(s.substring(start,s.length()).trim());
            while (charStack.size() > 0) {
                houzhui.add(charStack.pop().toString());
            }
            //后缀表达式生成完毕
            Stack<Integer> numStack = new Stack<>();
            while (houzhui.size()>0){
                if(houzhui.peekFirst().equals("+")){
                    int t2 =numStack.pop();
                    int t1 =numStack.pop();
                    numStack.add(t1+t2);
                    houzhui.pollFirst();
                }
                else if(houzhui.peekFirst().equals("-")){
                    int t2 =numStack.pop();
                    int t1 =numStack.pop();
                    System.out.println(t1+"  "+t2);
                    numStack.add(t1-t2);
                    houzhui.pollFirst();
                }
                else if(houzhui.peekFirst().equals("*")){
                    int t2 =numStack.pop();
                    int t1 =numStack.pop();
                    numStack.add(t1*t2);
                    houzhui.pollFirst();
                }
                else if(houzhui.peekFirst().equals("/")){
                    int t2 =numStack.pop();
                    int t1 =numStack.pop();
                    numStack.add(t1/t2);
                    houzhui.pollFirst();
                }else {
                    numStack.add(Integer.parseInt(houzhui.pollFirst()));
                }
            }
    
            return numStack.peek();
        }
  • 相关阅读:
    Redis 之order set有序集合结构及命令详解
    Redis 之set集合结构及命令详解
    Redis 之list链表结构及命令详解
    Redis 之string结构及命令详解
    Redis 通用key操作命令
    Redis 在Linux下的安装
    Entity FrameWork 操作使用详情
    Linux 之常用操作指令详解
    Linux 之根目录介绍
    php 加密解密函数封装
  • 原文地址:https://www.cnblogs.com/wys-373/p/13688097.html
Copyright © 2020-2023  润新知