栈 (3)数组实现 前缀 中缀 后缀表达式规则,逆波兰表达式实现计算器

1.代码

1.PolandNotation

package com.example.lib5.stack;

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

public class PolandNotation {
    public static void main(String[] args) {
        //将表达式(3+4)*5-6转为逆波兰表达式,如下,计算结果为29
        String suffixExpression = "30 4 + 5 * 6 -";
        //将逆波兰表达式加入到ArrayList中
        List<String> list = getListString(suffixExpression);
        //根据list来获取结果
        int calculate = getCalculate(list);
        System.out.println("计算结果为:"+calculate);
    }

    private static List<String> getListString(String suffixExpression) {
        List<String> list = new ArrayList<>();
        //对字符串进行分割
        String[] s = suffixExpression.split(" ");
        //遍历字符串数组,加入到list中
        for (String value : s) {
            list.add(value);
        }
        return list;
    }

    private static int getCalculate(List<String> list) {
        //创建一个String类型的栈
        Stack<String> stack = new Stack<>();
        //根据是否为数字对list进行遍历,压入到栈中
        for (String s : list) {
            if (s.matches("\\d+")) {//匹配为多位数
                //如果为数字的话,就直接加入到栈中
                stack.push(s);
            } else {//如果不是的话,取出栈两个值,然后跟这个符号进行计算,压入到栈
                int num1 = Integer.parseInt(stack.pop());
                int num2 = Integer.parseInt(stack.pop());
                int res = 0;
                if (s.equals("+")) {
                    res = num2 + num1;
                } else if (s.equals("-")) {
                    res = num2 - num1;
                } else if (s.equals("*")) {
                    res = num2 * num1;
                } else if (s.equals("/")) {
                    res = num2 / num1;
                }else {
                    throw new RuntimeException("运算符有错");
                }
                //把res入栈
                stack.push(String.valueOf(res));
            }
        }


        return Integer.parseInt(stack.pop());
    }
}

2.介绍

1.前缀表达式,计算机的计算方法,计算机是从右向左计算

  • 6 * 5 + 4 30

2.中缀表达式,就是我们认识的表达式

(3+4)*5-6

3.后缀表达式,便于理解的计算方法,也比较方便。与前缀表达式发过来

30 4 + 5 * 6 -

4.逆波兰表达式实现计算器

  1. 将中缀表达式(就是我们熟知的表达式)转为后缀表达式
  2. 将将后缀表达式加入到list中,便于取出于格式化
  3. 创建栈,根据list遍历的类型来压入栈。如果是数字的话,就直接压入栈,如果不是的话,就取出栈的两个值,然后根据符号来计算,将计算结果压入到栈。最后栈会只剩下一个值,就是计算结果

3.反思

1.

2.

3.

4.

5.

6.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值