//创建栈类 用一维数组模拟栈数据结构
public class Stack {
Object[] obj;//属性 栈,模拟栈的容量,由构造方法赋值容量大小。objec可以存储任何数据类型
int index;//模拟栈帧,栈帧等于obj容量时,表示栈满并提示,,当栈帧为0时,表示栈空并提示
public Stack() {
}
public Stack(Object[] obj, int index) {
this.obj = obj;
this.index = index;
}
public void push(Object[] obj) {//push方法模拟压栈,栈满要提示,压栈是顺序遍历...这里用object可以传入任何类型数组
for (int i = 0; i < obj.length; i++) {
index++;
System.out.print(obj[i] + " ");
if (index == this.obj.length) {
System.out.println("栈已满,等待弹栈");
return;
}
}
}
public void pop(Object[] obj) {//pop方法模拟弹栈,栈空提示,弹栈后进先出,采用倒序遍历
for (int i = this.obj.length - 1; i >= 0; i--) {
index--;
System.out.print(obj[i] + " ");
if (index == 0) {
System.out.println("栈已空");
return;
}
}
}
}
一、先创建一个栈类,提供两个属性
- Object【】 obj 可以模拟栈的容量大小,并且Object可以存储任何数据类型的一维数组
- int index 可以模拟栈帧,赋值0的时候模拟压栈,赋值obj.length的模拟弹栈
- 提供push和pop方法分别模拟压栈和弹栈,两个方法都差不多,区别 在于栈的特点是先进后出,后进先出
因此压栈可以用顺序遍历模拟,弹栈可以用倒叙遍历模拟。这里讲一下压栈,弹栈类似如此
用for循环遍历,判断条件为i=obj.length,这样可以限制压栈的元素个数不超过给定的栈容量。
元素输出一次,判断一次index大小是否等于给定的栈容量大小,当相当是,输出栈满,并return终止。
二、
创建测试类对压栈弹栈进行测试,这里就采用静态初始化做个例子
public class Test {
public static void main(String[] args) {
Stack s1=new Stack(new Object[10],0);//调用构造方法模拟压栈,此时栈帧为0
Object[] a={1,2,3,4,5,6,7,8,9,10,1,1,1,1,1,1};
s1.push(a);
Object[] b=new Object[10];
System.arraycopy(a,0,b,0,10);
s1.pop(b);
}
}
- 调用构造方法,模拟栈容量为10,栈帧为0的状态
- 定一个一维数组,给16个元素
- 调用压栈方法,经过测试,当遍历到10时,栈帧为9,指向栈顶部,表示栈已满。
输出1 2 3 4 5 6 7 8 9 10 栈已满,等待弹栈
4.在调用弹栈方法前,为了继续使用栈中的数组,可以新建一个数组,并赋值与栈相同的容量大小,将其copy进新数组中,这样就可以模拟弹栈了。
以上就是简单的一维数组模拟栈数据结构