生成逆波兰表达式

 /**
     * 比较当前运算符和栈顶运算符的优先级
     * @param stackPeek 栈顶元素
     * @param current 当前元素
     * @return
     */
    public static boolean getPriority(String stackPeek,String current)
    {
        if(stackPeek.matches("[\\*\\/]") && current.matches("[\\+\\-\\*\\/]"))
        {
            return true;
        }else if(stackPeek.matches("[\\+\\-]") && current.matches("\\+\\-"))
        {
            return true;
        }
        return false;
    }
    /**
     * 获得后缀表达式
     * @param infix 传入的中缀表达式的集合
     * @return
     */
    public static ArrayList<String> getSuffix(ArrayList<String> infix)
    {
        ArrayList<String> suffix = new ArrayList<String>();//用于存储最后的后缀式
        Stack<String> operator = new Stack<String>();//用于比较运算符优先级
        //第一步:分离数字和运算符
        for(String chs:infix)
        if(Character.isDigit(chs.charAt(0)))
        {//如果是数字,加入集合
            suffix.add(chs);
        }else{
            //如果不是数字,分离括号和运算符
            switch (chs.charAt(0)) {
            //左括号直接入栈
            case '(':
                operator.push(chs);
                break;
            //右括号,出栈,直到左括号出栈    
            case ')':
                while(!"(".equals(operator.peek()))
                       suffix.add(operator.pop());
                operator.pop();//左括号出栈
                break;
            default:
                //如果是运算符,先比较优先级,如果当前元素的优先级低于栈顶元素,则栈顶元素出栈,当前元素出栈
                //原则是保证栈顶元素的优先级最高
                //如果栈顶元素优先级高,返回true,栈顶元素出栈,直到存在元素优先级低于当前元素
                while(!operator.isEmpty() && getPriority(operator.peek(),chs))
                    suffix.add(operator.pop());
                operator.push(chs);//优先级高的栈顶元素出栈后,加入优先级更低的元素
                break;
            }
        }
        //判断栈中是否还有元素,有的话,取出
        while(!operator.isEmpty())
            suffix.add(operator.pop());
        System.out.println("中缀式是:"+suffix);
        return suffix;
    }
}

[(, 2, +, 3, ), *, 3, +, 9, *, 6, /, 8, +, (, 2, +, 4, /, 3, +, (, 2, +, 6, /, 5, ), )]

中缀式是:[2, 3, +, 3, *, 9, 6, *, 8, /, 2, 4, 3, /, 2, 6, 5, /, +, +, +, +, +]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值