//创建类继承队列的接口,在类中用栈实现队列的功能方法,Queue接口详见第队列接口及顺序队列的实现
类中需创建两个顺序栈的对象,ArrayStack类见顺序栈接口定义及顺序栈的实现
入队:和入栈一样都是从尾入。
出队:出栈时因为队列要出的实际是栈的最后一个,所以将除了栈底的元素都入栈到第二个栈,再将栈底弹出即是出队的元素;又因为其他元素转移时栈顶在第二个栈成了栈底,所以需将元素重新入栈到第一个栈,出队才算结束。
查看队首:和出队相同原理
package p2.线性结构;
import p1.接口.Queue;
import java.util.Iterator;
//用栈实现队列功能
public class StackToQueue {
public static void main(String[] args) {
QueueImplyByStack<Integer> queue = new QueueImplyByStack<>();
for (int i = 1;i<=5;i++){
queue.offer(i);
}
System.out.println(queue);
System.out.println(queue.poll());
System.out.println(queue);
}
}
class QueueImplyByStack<E> implements Queue<E>{
private ArrayStack<E> stackA; //主栈
private ArrayStack<E> stackB; //临时存储栈
public QueueImplyByStack(){
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 top() { //按队列规则查看第一个
if (isEmpty()){
throw new IllegalArgumentException("queue is null");
}
while (stackA.size() != 1){
stackB.push(stackA.pop());
}
E ret = stackA.peek();
while (!stackB.isEmpty()){
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();
}
}
383

被折叠的 条评论
为什么被折叠?



