波兰计算器的实现(代码实现) [数据结构][Java]

波兰计算器的实现(代码实现)

这里我们选择将后缀表达式先封装到了一个ArrayList对象中,然后通过这个ArrayList实例对后缀表达式中的数据遍历起来更加方便
  • 为什么我们说存储到集合中的数据比存放到String中的数据遍历起来更加的方便?
    • 因为我们的String类型中是一个字符一个字符进行存储的,这个时候我们遍历的时候可能是连续的多个字符表示了一个多位数,所以我们使用String变量存储数据之后遍历的时候我们还是要进行一个判断(这个步骤相对比较繁琐,所以我们就将其通过一个自定义方法封装到一个集合对象中)
    • 我们的集合是用来专门存储数据的一个容器,我们的集合中是一个元素一个元素的方式进行存储的,这个时候我们如果是一个多位数也罢,又或者是一个一位数也罢,这个时候我们都是以一个元素的形式存储到了集合中,我们遍历的时候遍历到对应的元素那么就会得到对应的元素(不用进行其他的一些判断)
      • 并且我们的集合的遍历方式也比较多:
        1. 使用普通的for循环进行一个遍历
        2. 使用增强for循环进行一个遍历
        3. 使用专门遍历集合的迭代器接口来对集合实例进行一个遍历
具体代码如下:
package com.ffyc.util;

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

/**
 * 辨析我们的逆波兰计算器类
 */
public class PolandNotation {
    /**
     * 别写一个方法,将一个后缀表达式(逆波兰表达式)中的数据和运算符依次放到一个ArrayList实例中
     */
    public static List<String> getListString(String suffixExpression){
        //将sufflxExpression使用空格进行一个分割
        String [] split = suffixExpression.split(" ");

        //创建一个ArrayList实例,将我们的后缀表达式中的数据装入我们的List对象中,并将这个ArrayList对象返回
        List<String> list = new ArrayList<>();
        for (String s:
             split) {
            list.add(s);
        }
        //将我们的ArrayList实例返回
        return list;
    }

    //计算后缀表达式值的方法
    public static int calculator(List<String> list){
        //创建一个栈,只需要一个栈就可以了
        Stack<String> stack = new Stack<>();

        //遍历list集合,进行后缀表达式的计算
        for (String s:
             list) {
            //这里我们使用正则表达式来判断是否为多位数
            if(s.matches("\\d+")) { //匹配的是多位数
                //如果是数值就直接入栈
                stack.push(s);
            }else{
                //如果是运算符我们就要从栈顶pop出两个数(进行一个对应的运算),记得运算之后我们要将运算结果入栈
                int num2 = Integer.parseInt(stack.pop());
                int num1 = Integer.parseInt(stack.pop());
                //创建一个临时变量用来存储运算结果
                int res = 0;
                switch(s){
                    case "+" :
                        res = num1 + num2;
                        break;
                    case "-" :
                        res = num1 - num2;
                        break;
                    case "*" :
                        res = num1 * num2;
                        break;
                    case "/" :
                        res = num1 / num2;
                        break;
                    default:
                        System.out.println("没有此操作符");
                        break;
                }
                //记得要将运算结果入栈
                stack.push(res+""); //使用基本数据类型的值+一个""空字符串就可以将一个数值直接转换为一个对应的字符串
            }
        }
        //最后留在stack(栈)中的数据就是运算结果
        return Integer.parseInt(stack.peek());
    }

    //编写一个测试方法:
    public static void main(String[] args) {
        //定义一个后缀表达式
           //中缀表达式: (3 + 4) * 5 - 6 转化为后缀表达式: 3 4 + 5 * 6 -
        String suffix = "3 4 + 5 * 6 -";
        //这里是对我们的将后缀表达式放到ArrayList实例中的方法进行的一个测试
        List<String> listString = getListString(suffix);
        System.out.println(listString);

        //对我们的存放后缀表达式的List对象中的后缀表达式进行一个计算
        int calculator = calculator(listString);

        System.out.println("rpnList = " + calculator);
        //我们测试之后可以发现测试的结果是没有问题的

    }
}

补充:

使用+(加号,也即是拼接符)将一个基本类型的数据和一个""空字符串拼接到一起就可以将一个数值直接转换为一个对应的字符串

  • 同时我们直接调用这个字符串的length()方法还可以获得这个快速的获得这个数值的长度
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值