逆波兰式的实现(Java)

逆波兰式

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Stack;

public class PolishNotation {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        sc.close();

        StringBuilder sb = new StringBuilder();         //结果
        Stack<Character> opStack = new Stack();         //运算符栈

        Map<Character,Integer> opMap = new HashMap();   //运算符优先级
        opMap.put('(', 0);
        opMap.put('+', 1);
        opMap.put('-', 1);
        opMap.put('*', 2);
        opMap.put('/', 2);

        //处理字符串
        for(int i=0;i<input.length();i++){
            if(input.charAt(i) == '('){             //如果是'('直接压栈
                opStack.push('(');
            }else if(isOperator(input.charAt(i))){  //如果是运算符
                char curOp = input.charAt(i);
                if(opStack.isEmpty())               //如果运算符栈是空,就直接压栈
                    opStack.push(curOp);
                else if(opMap.get(curOp) > opMap.get(opStack.peek()))   //运算符栈不为空,且当当前运算符的优先级比站内第一个运算符的优先级高的时候,压栈
                    opStack.push(curOp);
                else{                               //栈不为空,且运算符的优先级小于等于栈顶元素
                    for(int j = 0;j<=opStack.size();j++){
                        char ch = opStack.pop();    //弹出栈内第一个元素
                        sb.append(ch + " ");
                        if(opStack.isEmpty()){      
                            opStack.push(curOp);
                            break;
                        }else if(opMap.get(curOp) > opMap.get(opStack.peek())){
                            opStack.push(curOp);
                            break;
                        }
                    }
                }
            }else if(input.charAt(i) == ')'){       //如果是')'就把站内'('上的元素都弹出栈
                for(int j = 0;j<opStack.size();j++){
                    char c = opStack.pop();
                    if(c == '(')
                        break;
                    else
                        sb.append(c + " ");
                }
            }else{                                  //如果是数字就直接添加
                sb.append(input.charAt(i)+" ");
            }
        }

        //把栈内剩余的运算符都弹出站
        for(int i = 0;i<=opStack.size();i++){
            sb.append(opStack.pop() + " ");
        }

        System.out.println(sb);
    }

    private static boolean isOperator(char charAt) {
        // TODO Auto-generated method stub
        if(charAt == '+'||charAt=='-'||charAt=='*'||charAt=='/')
            return true;
        return false;
    }

}

运行测试:
这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值