如《数据结构与算法》之栈(1)所述,所构建的栈存在着如下问题:
(1)容量固定问题,即栈创建之后,容量固定,不能够进行扩容,对于小型的可预知的应用来说,简单的栈就可以了。但是对于不可预知的应用,此栈结构将不再适合,需要构建容量可扩展的栈结构;
(2)此栈只能存储int类型数据,对于其它类型数据将不再适用,可以用object类型代替int类型做数据定义。
针对以上问题,下面提供一种新的栈结构:
public class BigStack {
private Object[] array;
private Integer maxSize;
private Integer top;
// 栈构造函数
public BigStack() {
this.maxSize = 10;
array = new Object[10];
top = -1;
}
// 从栈顶压入数据
public void push(Object value) {
isGrow();
if (top < maxSize - 1) {
array[++top] = value;
}
}
// 弹出栈顶数据
public Object pop() {
return array[top--];
}
// 访问栈顶数据
public Object peek() {
return array[top];
}
// 判断栈是否为空
public boolean isEmpty() {
return (top == -1);
}
// 判断栈是否满了
public boolean isFull() {
return (top == maxSize - 1);
}
// 判断栈是否需要扩容
private void isGrow() {
if (top == maxSize - 1) {
Integer newSize = this.maxSize + 10;
Object[] newArray = new Object[newSize];
for (Integer i = 0; i < maxSize; i++) {
newArray[i] = array[i];
}
array = newArray;
maxSize = newSize;
}
}
}
测试程序如下:
public static void TestBigStack() {
BigStack stack = new BigStack();
for (int i = 0; i < 10; i++) {
stack.push("push:" + i);
}
System.out.println(stack.isFull());
for (int i = 10; i < 15; i++) {
stack.push("push:" + i);
}
System.out.println(stack.isFull());
while(!stack.isEmpty()){
System.out.println(stack.pop());
}
}