前言
要求:
1、这个栈可以储存java中的任何数据类型。
2、在栈中提供push方法压栈。(栈满了,要有提示信息。)
3、在栈中提供pop方法模拟弹栈。(栈空了也要有提示信息。)
4、编写测试程序。
一、栈的工作原理
首先在写程序之前,要弄清楚栈的工作原理。
我理解的栈就是栈相当于一个有开口的容器(比如水杯…)。
压栈就是有一个元素需要进入容器里,那它的位置一定是在栈顶。
弹栈就是如果栈里的元素想出来,必须是栈顶的元素先出来。
其实就是一个先进后出的原理。
二、代码实现
1.创建一个类来模拟栈
public class StackModel {
private Object[] elements;
public int sf=0;
public StackModel() {
this.elements=new Object[10];
}
public StackModel(Object[] elements) {
this.elements = elements;
}
public Object[] getElements() {
return elements;
}
public void setElements(Object[] elements) {
this.elements = elements;
}
public int getSf() {
return sf;
}
public void setSf(int sf) {
this.sf = sf;
}
这里我使用的是idea开发工具,在这个类中我定义了一个Object类型的数组,数组中只能存储本类型数据和子类型数据,因为题目要求可以存储任何引用类型的数据,而Object类是所有类的超级父类,所以Object类型的数组可以存放所有类型的数据。然后定义了一个int类型的栈帧sf,栈帧就是永远指向栈顶部的元素位置。最后用idea工具自动生成有参,无参的构造方法,然后我在无参的构造方法里初始化了数组容量为10,为了方便哈哈。
2.push和pop方法代码实现
push方法:
public void push(Object org){
if (elements[elements.length-1]!=null) {
System.out.println(org+"压栈失败");
return;
}
for (int i = 0;i<elements.length; i++){
if(this.elements[i]==null){
elements[i]=org;
sf=i;
System.out.println(org+"成功压栈,栈帧指向"+sf);
return;
}
}
代码原理:调用这个方法时,我先用if语句进行判断数组最后的位置是否为空,如果不为空那么说明栈已满没空间了直接return结束方法提示压栈失败。如果为空那么就可以压栈执行下面代码。这里我进行了一个for循环来查找数组第一次为空的位置,这个位置就是元素进行压栈的位置,找到之后把用户传入的数据存放到这个位置,栈帧sf也指向这个位置,输出压栈成功,栈帧指向的位置然后直接return结束方法和for循环。这里我感觉加个break会不会安全些,我为了少写点代码就这样写了,也没报错哈哈。
pop方法:
public void pop(){
if (elements[0]==null) {
System.out.println("弹栈失败");
return;
}
for (int i = elements.length-1;i>-1; i--){
if(this.elements[i]!=null){
elements[i]=null;
sf=i-1;
System.out.println("成功弹栈,栈帧指向"+sf);
return;
}
}
方法原理和push方法差不多,先判断数组栈底是否为空,如果是空就无法弹栈,打印输出“弹栈失败”。不为空执行for循环从数组尾部向头部找第一个不为空的位置,执行弹栈操作,将这个位置的元素扔出去赋值为空,栈帧指向下一个元素位置。
说明:这里的this就是这个对象本身,我的这段程序可写可不写,但如果方法的形参和局部变量一样时就要加this用于区分。
3.测试代码和运行结果
public class StackTest {
public static void main(String[] args) {
StackModel A = new StackModel();
for (int i = 0; i < 11; i++) {
A.push(i);
}
for (int i = 0; i <13 ; i++) {
A.pop();
}
}
}
C:\Users\86132\IdeaProjects\javase\out\production\stackmodle" StackTest
0成功压栈,栈帧指向0
1成功压栈,栈帧指向1
2成功压栈,栈帧指向2
3成功压栈,栈帧指向3
4成功压栈,栈帧指向4
5成功压栈,栈帧指向5
6成功压栈,栈帧指向6
7成功压栈,栈帧指向7
8成功压栈,栈帧指向8
9成功压栈,栈帧指向9
10压栈失败
成功弹栈,栈帧指向8
成功弹栈,栈帧指向7
成功弹栈,栈帧指向6
成功弹栈,栈帧指向5
成功弹栈,栈帧指向4
成功弹栈,栈帧指向3
成功弹栈,栈帧指向2
成功弹栈,栈帧指向1
成功弹栈,栈帧指向0
成功弹栈,栈帧指向-1
弹栈失败
弹栈失败
弹栈失败
Process finished with exit code 0
这里的测试代码直接通过无参的构造方法new一个StackModel对象A。通过A调用push和pop方法,然后用for循环重复这个代码,最后的执行结果也是ok的。
总结
这应该算是我自己独立完成的第一个java小程序吧,看到运行成功还是有点小成就感的哈哈。然后代码写的不好的地方还希望大佬们多提点意见。