用数组创建自动收缩的栈
描述: 栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素 成为新的栈顶元素。
代码入下:
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());
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。