力扣算法:基本计算器Ⅱ

原题链接: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();
    }

 

posted @ 2020-09-17 22:27  星际毁灭  阅读(225)  评论(0编辑  收藏  举报