algo/DynamicStackBaseArray.java

137 lines
3.0 KiB
Java
Raw Normal View History

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());
}
}
}