四则运算表达式值的获取算法

Stack的一个典型应用就是计算数字表达式,如9 + (3 - 1) * 3 + 10 / 2,计算机将中缀表达式转为后缀表达式,再对后缀表达式进行计算,过程如下:
数字直接输出;
栈为空时,遇到运算符,直接入栈;
遇到左括号,将其入栈;
遇到右括号,执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出;
遇到运算符(加减乘除),弹出所有优先级大于或等于该运算符的栈顶元素,然后将该运算符入栈;
最终将栈中的元素依次出栈,输出。
则以上输出答案为:9 3 1 - 3 * + 10 2 / +(后缀表达式)

计算后缀表达式:
遇到数字时,将数字压入堆栈;
遇到运算符时,弹出当前栈顶的两个数,用运算符对它们做相应的计算,并将结果入栈;
重复上述过程直到表达式最右端;
运算得出的值即为表达式的结果。

public class Test {

    public static void main(String[] args) {
        String s1 = "9 + ( 3 - 1 ) * 3 + 10 / 2";
        String s2 = "10 + 50 / 2 - 32 * 2 * 3 + 2 * 2";
        System.out.println(parseExpression(s1));
        System.out.println(parseExpression(s2));
    }
    
    public static int parseExpression(String s) {
        int res = 0;// 最终结果
        String[] strs = s.split(" ");// 按空格分割数字和运算符
        Stack stack = new Stack();
        List<String> list = new ArrayList<String>();// 统计后缀表达式
        
        for(int i=0; i<strs.length; i++) {
            String tmp = strs[i];

            if(StringUtil.IsNum(tmp)) {// 数字
                stack.push(tmp);
            } else if("+".equals(tmp) || "-".equals(tmp) || "*".equals(tmp) || "/".equals(tmp)) {// 运算符
                if(stack.size() == 0) {
                    stack.push(tmp);
                } else {
                    if("*".equals(tmp) || "/".equals(tmp)) {
                        while(true) {
                            if(stack.isEmpty()){
                                break;
                            }
                            String tmp2 = (String) stack.peek();
                            if(tmp2.equals("+") || tmp2.equals("-") || tmp2.equals("(")) {
                                break;
                            }
                            tmp2 = (String) stack.pop();
                            System.out.print(tmp2+" ");
                            list.add(tmp2);
                        }
                    } else {
                        while(true) {
                            if(stack.isEmpty()) {
                                break;
                            }
                            String tmp2 = (String) stack.peek();
                            if(tmp2.equals("(")) {
                                break;
                            }
                            tmp2 = (String) stack.pop();
                            System.out.print(tmp2 + " ");
                            list.add(tmp2);
                        }
                    }

                    stack.push(tmp);
                }
                
            } else if ("(".equals(tmp)) {// 左括号
                stack.push(tmp);
            } else if(")".equals(tmp)) {// 右括号
                while(true) {
                    if(stack.isEmpty()) {
                        break;
                    }
                    String tmp2 = (String) stack.peek();
                    if(tmp2.equals("(")) {
                        stack.pop();
                        break;
                    }
                    tmp2 = (String) stack.pop();
                    System.out.print(tmp2 + " ");
                    list.add(tmp2);
                }
            }
        }
        
        while(!stack.isEmpty()) {//将栈中元素依次输出
            String tmp = (String) stack.pop();
            System.out.print(tmp+" ");
            list.add(tmp);
        }
        
        Iterator iter = list.iterator();// 开始计算后缀表达式
        Stack stack2 = new Stack();
        while(iter.hasNext()) {
            String tmp = (String) iter.next();
            
            if(StringUtil.IsNum(tmp)) {
                stack2.push(tmp);
            } else {
                int num1 = Integer.parseInt((String)stack2.pop());
                int num2 = Integer.parseInt((String)stack2.pop());
                if("+".equals(tmp)) {
                    stack2.push((num1 + num2)+"");
                } else if("-".equals(tmp)) {
                    stack2.push((num2 - num1)+"");
                } else if("*".equals(tmp)) {
                    stack2.push((num1 * num2)+"");
                } else {
                    stack2.push((num2 / num1)+"");
                }
                res = Integer.parseInt((String) stack2.peek());
            }
        }
        return res;
    }
}

猜你喜欢

转载自www.cnblogs.com/yuanfei1110111/p/10296666.html