Java_商品货架管理问题

商品货架管理问题

今天我们来看一个Java数据结构的相关问题

问题描述

商品货架可以看成一个栈,栈顶商品的生产日期最早,栈底商品的生产日期最近。上货时,需要倒货架,以保证生产日期较近的商品在较靠下的位置。

接下来,我们先看代码,后谈分享

代码实现

import java.util.Arrays;
import java.util.Scanner;

class SequentialStack<datatype>{
    protected datatype[] stack;//声明数组
    private final static int STACK_SIZE=10;//定义数组最大长度
    protected int top;//声明top指针

    public  SequentialStack(){
        stack = (datatype[]) (new Object[STACK_SIZE]);//初始化数组
        top=-1;//定义top指针指向-1位置
    }

    public boolean isEmpty(){//用于判断栈是否为空的方法的方法
        if (top == -1)//如果top指针指向-1的话
            return true;//说明栈空
        else
            return false;//否则就是栈非空
    }

    public datatype pop(){//用于表达出栈的方法
        if(isEmpty())//如果栈空就抛出异常
            throw new RuntimeException("栈空");
        datatype result  =  stack[top];//定义一个记录top指针指向元素的变量
        top--;//出栈后top向前移动一位
        return result;//返回出栈时读取的元素
    }

    public void push(datatype a) {//用于表达进栈的方法
        top++;//将top指针先向后移动一位
        stack[top] =  a;//给样本空间的第一个位置赋值
        if (top == STACK_SIZE)//如果位置超出空间样本最大值,就抛出异常
            throw new RuntimeException("栈满、上溢错误,插入失败\n");
    }
    public String getSxz() {//用于得到顺序栈的方法
        return (Arrays.toString(stack));//返回这个完整的顺序栈
    }
}

class datatype {//定义一个datatype类
    private int id; //声明id
    private String data; //声明data

    public datatype() {//定义无参构造方法
        this.id=0;
        this.data=null;
    }

    public datatype(int id, String data) {//定义有参构造方法
        this.id = id;
        this.data = data;
    }
    //定义Id和Data的getter和setter
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }
}

public class HJGL {
    public static void putitems(SequentialStack<datatype> s, int a) {//用于表达向栈1存入商品的方法
        Scanner sc = new Scanner(System.in); //定义从键盘输入方法
        int f = 0; //定义初始顺序
        while (f<a){
            int ss =sc.nextInt();//输入id的值
            String bb = sc.next();//输入data的值
            datatype q =new datatype(ss,bb); //将Id和data的内容依次运行datatype的有参构造函数中
            s.push(q); //将datatype类型的q加入到顺序栈中
            f++;//令循环变量加一
        }
    }

    public static void main(String[] args) {
        SequentialStack<datatype> sheIf1 = new SequentialStack<datatype>();//定义第一个栈
        SequentialStack<datatype> sheIf2 = new SequentialStack<datatype>();//定义第二个栈
        int a; //定义承载商品数量的变量a
        int b; //定义承载商品数量的变量b
        datatype item = new datatype();//声明一个datatype的对象
        Scanner scan = new Scanner(System.in);
        System.out.println("===请输入货架上现有商品数量===");
        a = scan.nextInt();//输入货架上现有商品数量
        System.out.println("请输入货架上现有商品的编号和日期(*从货架最里端到最外端依次输入)");
        putitems(sheIf1, a); //将货架上的商品信息加入到顺序栈1中
        while (!sheIf1.isEmpty()) {//只要顺序栈1不为空
            sheIf2.push(sheIf1.pop());//就把顺序栈1的内容搬到顺序栈2中
        }

        System.out.println("请输入新上货架商品数量:");
        b = scan.nextInt();//输入要新上货架上商品数量

        System.out.println("请输入新上货架商品的编母及日期:(*日期从新到旧依次输入)");
        putitems(sheIf1,b); //将货架上新加入的商品信息加入到顺序栈1中
        while (!sheIf2.isEmpty()) {//只要顺序栈2不为空
            sheIf1.push(sheIf2.pop());//就把顺序栈2的内容搬到顺序栈1中
        }

        System.out.println("放入新货品后贷架上的所有商品编号及日期(*从货架最外端到最里端)");
        System.out.println("商品编号 生产日期");
        while (!sheIf1.isEmpty()) {//只要顺序栈1不为空
            item = sheIf1.pop();//用item来承接顺序栈1中所有内容
            System.out.println(" "+item.getId()+"   "+item.getData());
        }//在循环内依次输出商品编号信息和商品生产日期信息
        scan.close();//关闭Scanner的运行
    }
}

设计思路

按照从货架最里端到最外端依次入顺序栈1所有商品信息,再出栈进入到顺序栈2中时,将最新的生产日期的商品放在了顺序栈2的最前端,将最旧的生产日期的商品放在了顺序栈2的最后端,再向空的顺序栈1内按照从新日期到旧日期的顺序加入新的商品信息,再把顺序栈2的内容进行出栈操作,加入到顺序栈1中,加入时原先货架上的商品中旧生产日期的商品在加入的前端,较新的生产日期的商品在加入的后端,最终把顺序栈1中商品的Id和data输出,得到加入新商品后的货架,排序为从最外端商品到最里端商品

运行结果

请添加图片描述

心得分享

在开始做之前一定要画图形,便于理解和梳理逻辑。一定要分清楚新旧日期与货架前后位置的对应关系。

要把设定的datatype作为范型去引入到顺序栈的数组中去,在顺序栈的进栈与出栈方法操作中加入的变量与返回值设置为datatype类型。
从键盘输入只能是基本数据类型,int类型和datatyp类型是不能够互相转换的(把方法的返回类型设置为object可以实现代码输入中int类型和datatype类型的转换,但是在运行过程中还是会报错:int与datatype无法互相转换)。

从键盘输入后,进行基本类型转换,在把输入的数据调用datatype的有参构造函数中,从而封装成为datatype类型。

循环输入信息如果出错了,记住去查看是否是Scanner方法是否放在了循环以外,导致只输入一次信息便跳出了循环。

将顺序栈出栈后的内容转换为string类型(或者其他类型,但是与data类型相同),在把该内容赋值给setdata(),此方法会同时影响到getId()方法的输出内容,不可取。


以上就是本文全部内容,如果它对您有帮助,请您帮我点个赞,这对我真的很重要

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值