用数组创建自动收缩的栈

描述: 栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素 成为新的栈顶元素。

代码入下:
public class MyStack<T>{
 /**
 * 使用数组作为栈的底层存储 
 */ 
 private T[] elements;
    public MyStack() {
        this.elements =(T[]) new Object[0];
    }
/**
 * 压栈  
 * 表尾进行插入
 * @param t
 **/
 public void push(T t) {
          //创建新数组
         T[] newElements = (T[]) new Object[elements.length + 1];
         //复制原数组数据到新数组
         for (int i = 0; i < elements.length; i++) {
           newElements[i] = elements[i];
         }
         //新增元素添加到新数组
         newElements[elements.length] = t;
             //替换旧数组
         this.elements = newElements;
    }
    
/**
 * 出栈 
 * 返回表尾的数据并删除最后一个数据,使相邻数据成为栈顶元素 
 */ 
 public T prop() {
        if (this.elements.length == 0) {
            throw new RuntimeException("this stack is empty!");
        }
        T result = this.elements[this.elements.length - 1];
        T[] newElements = (T[]) new Object[elements.length - 1];
        //复制原数组数据到新数组
       for (int i = 0; i < newElements.length; i++) {
            newElements[i] = elements[i];
        }
        this.elements = newElements;
        return result;
    }
 /**
 * 是否是空数组 
 * @return
 */
 public boolean isEmpty() {
        return this.elements.length == 0;
 }
 
 /**
 * 查看栈顶元素 
 * @return
 */
 public T peek() {
    return this.elements[this.elements.length-1];
 }
 /**
 * 测试验证
 */   
 public static void main(String[] args) {
        MyStack<Integer> stack=new MyStack();
        stack.push(1);
        stack.push(2);
        System.out.println(stack.prop());
        System.out.println(stack.prop());
 }
}

Lawrence
40 声望4 粉丝

尔识真理,真理释尔 - 自律=自强