商品货架管理问题
今天我们来看一个Java数据结构的相关问题
1.问题描述
商品货架可以看成一个栈,栈顶商品的生产日期最早,栈底商品的生产日期最近。上货时,需要倒货架,以保证生产日期较近的商品在较靠下的位置。
接下来,我们先看代码,后谈分享
2.代码实现
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的运行
}
}
3.设计思路
按照从货架最里端到最外端依次入顺序栈1所有商品信息,再出栈进入到顺序栈2中时,将最新的生产日期的商品放在了顺序栈2的最前端,将最旧的生产日期的商品放在了顺序栈2的最后端,再向空的顺序栈1内按照从新日期到旧日期的顺序加入新的商品信息,再把顺序栈2的内容进行出栈操作,加入到顺序栈1中,加入时原先货架上的商品中旧生产日期的商品在加入的前端,较新的生产日期的商品在加入的后端,最终把顺序栈1中商品的Id和data输出,得到加入新商品后的货架,排序为从最外端商品到最里端商品
4.运行截图
5.心得体会
在开始做之前一定要画图形,便于理解和梳理逻辑。一定要分清楚新旧日期与货架前后位置的对应关系。
要把设定的datatype作为范型去引入到顺序栈的数组中去,在顺序栈的进栈与出栈方法操作中加入的变量与返回值设置为datatype类型。
从键盘输入只能是基本数据类型,int类型和datatyp类型是不能够互相转换的(把方法的返回类型设置为object可以实现代码输入中int类型和datatype类型的转换,但是在运行过程中还是会报错:int与datatype无法互相转换)。
从键盘输入后,进行基本类型转换,在把输入的数据调用datatype的有参构造函数中,从而封装成为datatype类型。
循环输入信息如果出错了,记住去查看是否是Scanner方法是否放在了循环以外,导致只输入一次信息便跳出了循环。
将顺序栈出栈后的内容转换为string类型(或者其他类型,但是与data类型相同),在把该内容赋值给setdata(),此方法会同时影响到getId()方法的输出内容,不可取。
以上就是本文全部内容,如果对你有帮助,可以随手点个赞,这对我真的很重要
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。