用顺序队列实现栈功能

//创建类继承栈的接口,在类中用队列实现栈的功能方法,Stack接口详见栈接口及顺序栈的实现
类中需创建两个顺序栈的对象,ArrayQueue类见队列的接口及顺序队列的实现
入栈:和入队一样都是从尾入。
出栈:出栈时因为栈要出的实际是队列的最后一个,所以将除了队尾的元素都入队到第二个队列,再将队尾弹出即是出栈的元素;而其他元素出队到第二个队列时顺序不变,所以出栈完成。
查看队首:和出队相同原理
因为不知道元素在第一个队列还是第二个队列,所以进行操作前要先进行判空,判断元素在哪个队列。

package p2.线性结构;

import p1.接口.Stack;

import java.util.Iterator;
//用队列实现栈功能
public class QueueToStack {
    public static void main(String[] args) {
        StackImplyByQueue<Integer> stack = new StackImplyByQueue<>();
        for (int i = 0;i<5;i++){
            stack.push(i);
        }
        System.out.println(stack);
        System.out.println(stack.pop());
        System.out.println(stack);
    }
}

class StackImplyByQueue<E> implements Stack<E>{
    private ArrayQueue<E> queueA;
    private ArrayQueue<E> queueB;
    public StackImplyByQueue(){
        queueA = new ArrayQueue<>();
        queueB = new ArrayQueue<>();
    }
    //查看栈长度
    @Override
    public int size() {
        if (queueA.isEmpty() && queueA.isEmpty()){
            return 0;
        }else if (!queueA.isEmpty()){
            return queueA.size();
        }else {
            return queueB.size();
        }
    }
    //判空
    @Override
    public boolean isEmpty() {
        return queueA.isEmpty() && queueB.isEmpty();
    }
    //入栈
    @Override
    public void push(E element) {
        if (queueA.isEmpty() && queueB.isEmpty()){
            queueA.offer(element);
        }else if (!queueA.isEmpty()){
            queueA.offer(element);
        }else {
            queueB.offer(element);
        }
    }
    //出栈
    @Override
    public E pop() {
        if(isEmpty()){
            throw new IllegalArgumentException("stack is empty");
        }
        E ret = null;
        if (!queueA.isEmpty()){
            while (queueA.size() != 1){
                queueB.offer(queueA.poll());
            }
            ret = queueA.poll();
        }else {
            while (queueB.size() != 1){
                queueA.offer(queueB.poll());
            }
            ret = queueB.poll();
        }
        return ret;
    }
    //查看栈顶元素
    @Override
    public E peek() {
        if(isEmpty()){
            throw new IllegalArgumentException("stack is empty");
        }
        E ret = null;
        if (!queueA.isEmpty()){
            while (queueA.size() != 1){
                queueB.offer(queueA.poll());
            }
            ret = queueA.poll();
            queueB.offer(ret);
        }else {
            while (queueB.size() != 1){
                queueA.offer(queueB.poll());
            }
            ret = queueB.poll();
            queueA.offer(ret);
        }
        return ret;
    }
    //栈清空
    @Override
    public void clear() {
        queueA.clear();
        queueB.clear();
    }
    //迭代器
    @Override
    public Iterator<E> iterator() {
        if (isEmpty()){
            return queueA.iterator();
        }else if (!queueA.isEmpty()){
            return queueA.iterator();
        }else {
            return queueB.iterator();
        }
    }
    //输出形式
    @Override
    public String toString(){
        if (isEmpty()){
            return "[]";
        }else if (!queueA.isEmpty()){
            return queueA.toString();
        }else {
            return queueB.toString();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值