java实现中缀表达式转后缀表达式并输出运算结果

原创 2018年04月15日 20:44:17

原则:数字输出,运算符进栈,括号匹配出栈,栈顶优先级低不出栈

public class postfix {

    public static String[] outPostfix(String[] infix){
        String[] postfix = new String[100];
        int index = 0;
        int bracket = 0; //标记括号的对数
        Map operatorMap = new HashMap<>(); // 用hashmap存储每个运算符的优先度
        operatorMap.put("+", 1);
        operatorMap.put("-", 1);
        operatorMap.put("*", 2);
        operatorMap.put("/", 2);
        Stack<String> postfixStack = new Stack<>(); //用于存储后缀算法的运算符
        for (int i = 0; i < infix.length && infix[i] != null; i++) {
            String current = infix[i];
            if (current.charAt(0) >= '0' && current.charAt(0) <= '9'){ //遇到数字直接放入后缀数组
                postfix[index++] = current;
            }else {
                if (postfixStack.isEmpty()){ //保证后缀运算符栈不为空
                    postfixStack.push(current);
                }
                /* *
                *如果括号已经全部处理,而且当前字符不是括号,
                *后缀运算符栈顶不是括号,并且栈顶运算符优先度小于当前运算符优先度,
                *将当前遍历运算符后边的数字放入后缀数组中,再将当前运算符放入后缀数组中。
                */
                else if (bracket == 0 && !isBracket(current) &&
                        !isBracket(postfixStack.peek()) &&
                        Integer.parseInt(String.valueOf(operatorMap.get(postfixStack.peek()))) < Integer.parseInt(String.valueOf(operatorMap.get(current)))){
                    postfix[index++] = infix[i + 1];
                    postfix[index++] = infix[i];
                    i++;
                }
                /**
                 * 同理 栈顶运算符优先度大于等于当前运算符优先度,
                 *将栈顶运算符放入后缀数组中,再将当前遍历的运算符放入栈中
                 */
                else if (bracket == 0 && !isBracket(current) &&
                        !isBracket(postfixStack.peek()) &&
                        Integer.parseInt(String.valueOf(operatorMap.get(postfixStack.peek()))) >= Integer.parseInt(String.valueOf(operatorMap.get(current)))){
                    postfix[index++] = postfixStack.pop();
                    postfixStack.push(current);
                }
                else {
                    if (current.equals("(")) bracket++; // 若遇到左括号,bracket加1
                    postfixStack.push(current);
                    if (postfixStack.peek().equals(")")){ //遇到右括号,bracket减1,同时将栈中括号间的运算符出栈
                        bracket--;
                        postfixStack.pop();
                        while (!postfixStack.peek().equals("(")){
                            postfix[index++] = postfixStack.pop();
                        }
                        postfixStack.pop();
                    }
                }
            }
        }
        while (!postfixStack.isEmpty()) postfix[index++] = postfixStack.pop();
        return postfix;
    }
    public static double result(String[] postfix){
        double result = 0;
        Stack<Double> computeStack = new Stack();
        for (int i = 0; i < postfix.length && postfix[i] != null; i++) {
            String current = postfix[i];
            //当前字符为数字,则入栈
            if (current.charAt(0) >= '0' && current.charAt(0) <= '9'){
                computeStack.push(todouble(current));
            }
            //当前字符为运算符,从栈顶取出两个数字运算出结果,并放入栈中
            else {
                switch (current){
                    case "+": result = computeStack.pop() + computeStack.pop();
                    computeStack.push(result);break;
                    case "-": result = -(computeStack.pop() - computeStack.pop());
                    computeStack.push(result);break;
                    case "*": result = computeStack.pop() * computeStack.pop();
                    computeStack.push(result);break;
                    case "/": result = 1 / (computeStack.pop() / computeStack.pop());
                    computeStack.push(result);break;
                    default: break;
                }
            }
        }
        return result;
    }
    public static double todouble(String str){
        double num = 0;
        num = Double.valueOf(Integer.parseInt(str));
        return num;
    }
    public static boolean isBracket(String str){
        if (str.equals("(") || str.equals(")")) return true;
        else return false;
    }
    public static void main(String[] args){
        String[] infix = new String[]{"9", "+", "(", "3",  "-", "1", ")", "*", "3", "+", "10", "/", "2"};
        String[] infix1 = new String[100];
        int i = 0;
        Scanner in=new Scanner(System.in);
        while (in.hasNext()){
            infix1[i++] = in.nextLine();
        }
        in.close();
        infix = outPostfix(infix1);
        for (i = 0; i < infix.length && infix[i] != null; i++) {
            System.out.print(infix[i] + " ");
        }
        System.out.print("\n");
        System.out.println(result(infix));
    }
}

输入:
2
*
(
3
+
3
*
(
5
+
4
)

)

后缀表达式:

2 3 3 5 4 + * + * 

结果:60.0

Java实现中缀表达式转后缀表达式并计算结果

栈中缀表达式就是形如a(b-c)+d*这样我们平常写的式子,如果按平时逻辑上的处理顺序的话计算机比较难正确处理,因为运算符之间有优先级,括号的优先级比乘除高,乘除的优先级比加减高,这是小学的知识。 ...
  • dgeek
  • dgeek
  • 2017-03-19 13:54:15
  • 3741

中缀表达式转后缀表达式并进行计算 原理

在计算一个表达式的时候,可以用数据结构中栈的知识,将我们平常熟悉的中缀表达式转为后缀表达式,再将后缀表达式进行计算得到结果。先说下什么是中缀什么是后缀: 中缀表达式:eg: 9+(3-1)*3+10/...
  • sdr_zd
  • sdr_zd
  • 2016-08-04 18:01:10
  • 982

输入一个中缀表达式,将其转换为等价的后缀表达式后输出并计算结果。

  • 2010年10月14日 21:48
  • 2KB
  • 下载

栈的运用(中缀表达式转换为后缀表达式,并对后缀表达式求值。)

中缀表达式转换成后缀表达式的基本思想: 顺序扫描中缀表达式: 若读入的是一个运算分量,则输出; 若读入的是一个左括号,则入栈,栈中左括号的优先级被视为比任何操作符都低。...
  • wilver
  • wilver
  • 2016-03-31 10:13:25
  • 1460

java将中缀表达式转为后缀表达式

参考自:http://blog.sina.com.cn/s/blog_6047c8870100qapb.html package com.lmiky.test; import java...
  • linminqin
  • linminqin
  • 2011-09-30 17:04:03
  • 9300

利用JAVA实现中缀表达式向后缀表达式的转换,并求出表达式的值

/*  * 计算表达式的值:利用表达式的后缀表达式来计算!  */ import java.util.ArrayList; import java.util.Iterator; import...
  • lotty_wh
  • lotty_wh
  • 2015-09-10 18:54:42
  • 516

中缀表达式转后缀表达式并输出计算结果

后缀表达式又称逆波兰表达式,明显的特点是:逆波兰表达式中没有括号,计算时将操作符之前的第一个数作为右操作数,第二个数作为左操作数,进行计算,得到的值继续放入逆波兰表达式中。    但日常生活中我们总...
  • sinat_36118270
  • sinat_36118270
  • 2017-04-20 13:42:22
  • 4937

java实现中缀表达式转后缀表达式并且计算

自己写一个栈 用数组实现package cn.itcast.StackAndQuen; import java.util.ArrayList; import java.util.List; impo...
  • likailonghaha
  • likailonghaha
  • 2016-10-17 17:04:18
  • 1940

c++ 中缀表达式转后缀表达式并计算值

什么是中缀表达式, 前缀表达式, 后缀表达式? 在数据结构中, 二叉树的遍历有三种(这里不考虑分层遍历等特殊需求): 前序遍历, 中序遍历和后序遍历. 如果将表达式看做一颗二叉树, 那么中缀表达式, ...
  • lbcab
  • lbcab
  • 2016-06-07 13:26:11
  • 4845

C++栈的应用——后缀表达式求值、中缀表达式到后缀表达式的转换

通常我们把栈归为一种基本的数据结构,同时它也是一种线性表结构,也就是说你要自己实现一个栈的数据结构,既可以用数组实现,也可以用链表实现。栈最主要的特点就是“先进后出”,因为栈只有一个入口和出口。...
  • qq_26849233
  • qq_26849233
  • 2017-06-03 09:06:49
  • 2073
收藏助手
不良信息举报
您举报文章:java实现中缀表达式转后缀表达式并输出运算结果
举报原因:
原因补充:

(最多只允许输入30个字)