package com.arithmetic;
import java.util.Iterator;
import java.util.NoSuchElementException;
// 能够动态调整数组大小的实现
public class ResizingArrayStack<Item> implements Iteratable<Item> {
private Item[] a; // 栈元素
private int N;
ResizingArrayStack(int cap) {
a = (Item[]) new Object[cap];
N = 0;
}
// 新增时检查数组大小,如果栈的大小和数组大小一致,那么将原来数组长度加倍
void push(Item item) {
if (N == a.length) {
resize(2 * a.length);
}
a[N++] = item;
}
// 删除栈顶元素,如果数组较大,可以将其长度减半
Item pop() {
if (isEmpty()) throw new NoSuchElementException("Stack underflow");
Item item = a[N - 1];
a[N - 1] = null; // to avoid loitering
N--;
// shrink size of array if necessary
if (N > 0 && N == a.length / 4) resize(a.length / 2);
return item;
}
int size() {
return N;
}
boolean isEmpty() {
return N == 0;
}
// 实现一个方法,将栈移动到另外一个大小不同的数组中
private void resize(int max) {
Item[] temp = (Item[]) new Object[max];
for (int i = 0; i < N; i++) {
temp[i] = a[i];
}
a = temp;
}
@Override
public Iterator<Item> iterator() {
return new ReverseArrayIterator();
}
private class ReverseArrayIterator implements Iterator<Item> {
private int i;
public ReverseArrayIterator() {
i = N - 1;
}
@Override
public boolean hasNext() {
return i >= 0;
}
@Override
public Item next() {
if (!hasNext()) throw new NoSuchElementException();
return a[i--];
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
public static void main(String[] args) {
ResizingArrayStack stack = new ResizingArrayStack<>(100);
stack.push(1);
stack.push(2);
stack.push(3);
Iterator it = stack.iterator();
while (it.hasNext()) {
System.out.println("Iterator : " + it.next());
}
}
}
ResizingArrayStack 动态调整数组大小
猜你喜欢
转载自blog.csdn.net/qq_34579060/article/details/84982899
今日推荐
周排行