2019-03-16 16:50:52 +08:00
|
|
|
|
package Stack;
|
|
|
|
|
|
|
|
|
|
import java.util.Iterator;
|
|
|
|
|
|
2019-03-16 16:55:37 +08:00
|
|
|
|
/**
|
|
|
|
|
* 顺序栈的动态扩容
|
|
|
|
|
* Author: PeiJiaNi
|
|
|
|
|
* @param <T> 顺序栈元素类型
|
|
|
|
|
*/
|
|
|
|
|
|
2019-03-16 16:50:52 +08:00
|
|
|
|
public class DynamicStackBaseArray<T> implements Iterable<T> {
|
|
|
|
|
private T[] items; // 数组
|
|
|
|
|
private int count; // 栈中的元素个数
|
|
|
|
|
private int length; // 栈空间大小
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 初始化栈
|
|
|
|
|
*
|
|
|
|
|
* @param length 栈空间大小
|
|
|
|
|
*/
|
|
|
|
|
public DynamicStackBaseArray(int length) {
|
|
|
|
|
this.items = (T[]) new Object[length];
|
|
|
|
|
this.count = 0;
|
|
|
|
|
this.length = length;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 入栈操作 平均时间复杂度O(1)s
|
|
|
|
|
*
|
|
|
|
|
* @param item 入栈元素
|
|
|
|
|
*/
|
|
|
|
|
public void push(T item) {
|
|
|
|
|
// 栈空间已满,则扩容
|
|
|
|
|
if (count == length) {
|
|
|
|
|
resize(2 * items.length);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
items[count++] = item;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 出栈操作 平均时间复杂度O(1)
|
|
|
|
|
*
|
|
|
|
|
* @return 如果栈内不为空,则返回栈顶元素,否则返回-1
|
|
|
|
|
*/
|
|
|
|
|
public T pop() {
|
|
|
|
|
if (count == 0) {
|
|
|
|
|
System.out.println("当前栈已空,无法进行出栈操作");
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
T item = items[--count];
|
|
|
|
|
items[count] = null;
|
|
|
|
|
|
|
|
|
|
if (count > 0 && (count == items.length / 4)) {
|
|
|
|
|
resize(items.length / 2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 返回下标为 count-1 的数组元素,并且栈中元素个数count-1
|
|
|
|
|
return item;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 栈空间动态增加或减小
|
|
|
|
|
*
|
|
|
|
|
* @param size
|
|
|
|
|
*/
|
|
|
|
|
private void resize(int size) {
|
|
|
|
|
T[] newItems = (T[]) new Object[size];
|
|
|
|
|
for (int i = 0; i < count; i++) {
|
|
|
|
|
newItems[i] = this.items[i];
|
|
|
|
|
}
|
|
|
|
|
this.items = newItems;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//返回栈中最近添加的元素而不删除它
|
|
|
|
|
public T peek() {
|
|
|
|
|
return items[count - 1];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 判断当前栈是否为空
|
|
|
|
|
*
|
|
|
|
|
* @return 栈为空,则返回true,否则返回-1
|
|
|
|
|
*/
|
|
|
|
|
public boolean isEmpty() {
|
|
|
|
|
return count == 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 返回栈中元素个数
|
|
|
|
|
*
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public int size() {
|
|
|
|
|
return count;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public Iterator<T> iterator() {
|
|
|
|
|
return new ArrayIterator();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 内部类
|
|
|
|
|
class ArrayIterator implements Iterator {
|
|
|
|
|
int numOfItems = count;
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean hasNext() {
|
|
|
|
|
return numOfItems > 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public T next() {
|
|
|
|
|
return items[--numOfItems];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void main(String[] args) {
|
|
|
|
|
DynamicStackBaseArray<Integer> stack = new DynamicStackBaseArray<Integer>(6);
|
|
|
|
|
stack.push(1);
|
|
|
|
|
stack.push(2);
|
|
|
|
|
stack.push(3);
|
|
|
|
|
stack.push(4);
|
|
|
|
|
stack.push(5);
|
|
|
|
|
// System.out.println(stack.peek());
|
|
|
|
|
Iterator iterator = stack.iterator();
|
|
|
|
|
// System.out.println(iterator.hasNext());
|
|
|
|
|
while (iterator.hasNext()) {
|
|
|
|
|
System.out.println(iterator.next());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|