package com.javase.进阶.数组;/*** 编写程序,使用一维数组,模拟栈数据结构* 要求:* 1、这个栈可以存储java中的任何类型数据* 2、在栈中提供push方法模拟压栈。(栈满了,要有提示信息)* 3、在栈中提供pop方法模拟弹栈。(栈空了,要有提示信息)* 4、编写测试程序,new栈对象,调用push和pop方法来模拟压栈弹栈的动作* 5、假设栈的默认初始化容量是10(注意无参构造方法的编写)*/
public class MyStackTest {public static void main(String[] args) {
// 初始化栈,默认容量10MyStack myStack = new MyStack();
// 开始压栈
// 采用循环压栈(压栈11次,因为栈的容量是10,多压1次出现压栈失败)for (int i = 1;i <= 11;i++){myStack.push(new Object());}// 栈满后,开始弹栈
// 也采用循环弹栈的方式(弹栈11次,因为栈的容量是10,多弹1次出现弹栈失败)for (int i = 1;i <= 11;i++){myStack.pop();}}
}
//栈类
class MyStack{
// 用数组来模拟栈,为了存储Java中的任何类型对象,需要使用Object[]数组private Object[] elements;
// 栈帧,永远指向栈顶部元素private int index;// 无参构造方法public MyStack() {
// this();该语法是用来调用本类中的其他构造方法
// 默认初始化容量是10
// 对index初始化 因为0是第一个元素,始化时,栈中没有元素,所以index不等于0,也不能等于1,只能等于-1。this(new Object[10],-1);}// 有参构造public MyStack(Object[] elements, int index) {this.elements = elements;this.index = index;}// set and get 方法public Object[] getElements() {return elements;}public void setElements(Object[] elements) {this.elements = elements;}public int getIndex() {return index;}public void setIndex(int index) {this.index = index;}/*** 压栈的方法* @param object 被压栈的元素*/public void push(Object object){//当栈针(数组下标大于等于数组最大下标值的时候,说明数组已满,也就是栈已满)if (index >= elements.length - 1){System.out.println("栈已满,压栈失败!");return;}index++;elements[index] = object;System.out.println("压栈" + object + "成功!栈帧指向:" + index);
// 上面两行代码可以合并成下面一行代码,这里的"++"一定要在"index"之前,表示先自加1后赋值
// elements[++index] = object;}/*** 弹栈的方法*/public void pop(){if (index <= -1){System.out.println("栈已空,弹栈失败!");return;}System.out.println("成功弹栈" + elements[index] + "!栈帧指向:" + (index - 1));
// 注意:弹栈成功后,对应位置就没有元素了,所以应给一个nullelements[index] = null;
// 弹栈成功后栈针下移一位index--;}
}