package Stack;
import java.util.Iterator;
/**
* é¡ºåºæ ç卿æ©å®¹
* Author: PeiJiaNi
* @param é¡ºåºæ å
ç´ ç±»å
*/
public class DynamicStackBaseArray implements Iterable {
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)
*
* @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 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 stack = new DynamicStackBaseArray(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());
}
}
}