由两个栈实现队列

栈和队列是计算机编程中常用的数据结构,通过使用数据结构,可以在逻辑上模拟数据的存储方式和构造该方式上的方法,从而达到简化编程的效果.

栈是一种具有后进先出特性(FILO)的数据结构,数据域包括栈顶(top)、栈底、栈空间大小(maxsize),行为包括出栈(pop())、入栈(push())、栈空(empty())、栈满(full())等

队列是一种具有先进先出特性(FIFO)的数据结构,数据域包括队头(front),队尾(rear),队空间(maxsize),行为包括进队(EnQueue())、出队(DeQueue())、队空(empty())、栈队(full())等

要实现由两个栈组成的队列,首先要知道栈和队列的特性,其次是根据它们的特性进行算法设计,最后进行代码实现。 由于栈的LIFO特性,容易想到要实现队列,只需要将栈进行两次入栈操作即可达到队列FIFO的特性。

设计算法时要注意 - 如果弹入栈要往弹出栈压入元素,那么必须一次性把弹入栈元素中的数据全部压入。 - 如果弹出栈不为空,弹入栈据对不能向弹出栈压入数据。 以上两点避免的队列的顺序混乱。

具体代码实现如下所示

class TwoStackQuene {
    public Stack stackPush;//弹进栈
    public Stack stackPop;//弹出栈
    public TwoStackQuene(){
        stackPush=new Stack();
        stackPop=new Stack();
    }//构造器初始化弹进、弹出栈

    public void add(int pushInt){
        stackPush.push(pushInt);
    }//重写进栈方法

    //重写poll()方法
    public int poll(){
        if(stackPop.empty()&&stackPush.empty()){
            throw new RuntimeException("queue is empty!!!");//检测弹进、弹出栈是否为空,若为空则抛出异常。
        }else if(stackPop.empty()){
            while(!stackPush.empty()){
                stackPop.push(stackPush.pop());/*若弹出栈为空,弹进栈不为空,将弹进栈元素弹入弹出栈。*/
            }
        }
        return stackPop.pop();//弹出弹出栈栈顶元素
    }

    //重写peek()方法,peek方法跟poll方法类似,在此不进行注释
    public int peek(){
        if(stackPop.empty()&&stackPush.empty()){
            throw new RuntimeException("Queue is empty!!!");
        }else if(stackPop.empty()){
            while(!stackPush.empty()){
                stackPop.push(stackPush.pop());
            }
        }
        return stackPop.peek();
    }
}

上述代码经测试,成功编译,无差错。
实现效果如下
这里写图片描述
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值