中缀表达式转换后缀表达式并求值(java实现)

中缀表达式转换后缀表达式并求值(java实现)


中缀表达式转换后缀表达式

 为了处理方便,编译程序通常把中缀表达式转化为后缀表达式,后缀表达式也称为“逆波兰式”指代双目运算符在两个运算对象的后面,例如:49*23+。   

程序伪代码

1.实例化一个空栈S
2.扫描容器中的字符,执行以下操作
         2.1若当前字符是运算对象即数字,则存入后缀表达式容器。
         2.2若当前字符是运算符,且其优先级比栈顶运算符高,则使其入栈。
         2.3若当前字符是运算符,且其优先级比栈顶运算符相等或低,则将栈顶元素弹出,并将当前字符压入栈中。

中缀表达式转换后缀表达式求值过程

待处理表达式栈内状态(底<->顶)后缀表达式容器
2*(9+6/3-5)nullnull
*(9+6/3-5)null2
(9+6/3-5)*2
9+6/3-5)*(2
+6/3-5)*(29
6/3-5)*(+29
/3-5)*(+296
3-5)*(+/296
-5)*(+/2963
5)*(-2963/+
)*(-2963/+5
*2963/+5-
2963/+5-*

后缀表达式求值

在后缀表达式中,所有的计算按照运算符出现的顺序由左至右进行。   

程序伪代码

1.实例化一个空栈S
2.扫描容器中的字符,执行以下操作
         2.1若当前字符是运算对象即数字,则入栈。
    弹出两个元素进行运算后入栈。
3.输出栈顶元素即结果

后缀表达式求值过程

读字符栈内状态(底<->顶)说明
222入栈
92 9 66入栈
32 9 6 33入栈
/2 9 26,3出栈,执行/运算,将结果2入栈
+2 119,2出栈,执行+运算,将结果11入栈
52 11 55入栈
-2 65,11出栈,执行-运算,将结果6入栈
*122,6出栈执行*操作,将结果12入栈

代码

package com.SimpleSort;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;
import java.util.Stack;

public class WorkExpress {
    static HashMap<Character, Integer> charTable = new HashMap<Character, Integer>();
    //设置运算符的优先级,( 入栈前优先级最高。入栈后最低。
    public static void initChatTable(HashMap<Character, Integer> charTable) {
        charTable.put('+', 1);
        charTable.put('-', 1);
        charTable.put('*', 2);
        charTable.put('/', 2);
        charTable.put('(', 0);
    }
    //生成后缀表达式
    public static ArrayList<Character> listWork(char[] express ) {
        List<Character> list = new ArrayList<Character>();
        initChatTable(charTable);
        Stack<Character> stack = new Stack<Character>();
        for(char a : express){
        //如果是数字,直接放入容器
            if(a>='0'&& a<='9'){
                list.add(a);
            }else{
                //“)”与“(”内的运算符逐个输出
                 if(a == ')'){
                    while(stack.peek() != '('){
                        list.add(stack.pop());
                    }
                    //弹出“(” 但是不放入容器。
                    stack.pop();
                    }else if(stack.size()==0 || compareChar(a, stack.peek()){                                 stack.push(a);
                }else{
                    /**
                     * 当前运算符优先级小于等于栈顶运算符,
                     * 弹出栈顶运算符,并继续判断。
                     * **/
                    list.add(stack.pop());
                    while(!compareChar(a, stack.peek())){
                        list.add(stack.pop());
                    }
                    stack.push(a);
                }
            }
                    }
        while(stack.size() != 0 ){
            list.add(stack.pop());
        }
        return (ArrayList<Character>) list;
    }
    //true:当前元素大于栈顶元素;false:当前元素小于等于栈顶元素
    public static boolean compareChar(char currect,char stackTop){
        if(currect == '('){
            return true;
        }
        else if(charTable.get(currect)>charTable.get(stackTop)){
            return true;
        }
        return false;
    }
    public static void main(String[] args) {
        Scanner sca  = new Scanner(System.in);
        char[] express = sca.next().toCharArray();
        ArrayList<Character> list = listWork(express);
        Stack<Integer> work = new Stack<Integer>();
        int result = 0;
        System.out.println(list);
        for(Character a : list){
            System.out.println(result);
            if(a>='0' && a <='9'){
                work.push(a-48);
            }else if(!work.isEmpty()){
        //“/”和“-”运算要注意除数和被除数的位置。
                Integer per = work.pop();
                if(a == '+'){
                    result =  (per +  work.pop() );
                    work.push(result);
                }
                if(a == '-'){
                    result =  (  work.pop() -per);
                    work.push(result);
                }
                if(a == '*'){
                    result =  (per *  work.pop());
                    work.push(result);
                }
                if(a == '/'){
                    result = (work.pop() / per) ;
                    work.push(result);
                }
            }
        }
        System.out.println(result);
    }
}

欢迎学习,如有错误请及时联系本人修改。
希望指出本人不足共进步               
                                                                                                                        LLY19960418

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值