利用2个栈来实现队列:
栈A:1,2,3
栈B:
难点;
poll方法
先将栈A弹栈到只剩一个元素,弹出来的元素push到栈B中保存起来.在吧A中的元素保存起来作为返回值;在弹出去;这时在栈A中弹入(栈B中的所有元素一一弹出);返回保存的元素;
peek方法同理
代码实现:
class QueueImplByStack<E> implements Queue<E>{
private ArrayStack<E> stackA;
private ArrayStack<E> stackB;
public QueueImplByStack() {
stackA = new ArrayStack<>();
stackB = new ArrayStack<>();
}
@Override
public void offer(E element) {
stackA.push(element);
}
@Override
public E poll() {
if (isEmpty()){
throw new IllegalArgumentException(" queue is null");
}while (stackA.size() != 1){
stackB.push(stackA.pop());
} E ret = stackA.pop();
while (!stackB.isEmpty()){
stackA.push(stackB.pop());
}
return ret;
}
@Override
public E peek() {
if (isEmpty()){
throw new IllegalArgumentException("");
}while (stackA.size() != 1){
stackB.push(stackA.pop());
} E ret = stackA.peek();
while (stackB.size() == 0){
stackA.push(stackB.pop());
}
return ret;
}
@Override
public boolean isEmpty() {
return stackA.isEmpty();
}
@Override
public void clear() {
stackA.clear();
}
@Override
public int size() {
return stackA.size();
}
@Override
public Iterator<E> iterator() {
return stackA.iterator();
}
@Override
public String toString() {
return stackA.toString();
}
}