算法系列之栈和队列(二):用栈实现一个队列,要求可以实现队列的基本操作

一、题目

需要实现一个类,使用两个栈实现队列的基本操作,包括add、poll、peek。

二、分析

栈的特性是先入后出,队列的特点是先入先出。所以设计的时候两个栈中,一个负责数据压入,一个负责数据弹出。当数据弹出的时候必须从弹出堆栈中进行统一弹出,同时在数据弹出之前,必须将数据压入堆栈中的数据全部压入弹出堆栈中。因为如果不是全部压入的话,在弹出的过程中就会破坏队列要求的先入先出的顺序。同时当弹出堆栈存在数据的时候不能进行数据压入操作,因为弹出堆栈中已经是上一次数据的压入顺序,如果在此时进行数据的压入也会破坏弹出顺序。

三、代码实现

package com.algorithm;

import java.util.Stack;

import com.exception.ProgramException;

/**
 * @author taomeng
 * @Date 2018年9月8日
 * @Discription:两个栈实现队列功能
 */
public class NewQueue {

    /**
     * 数据压入
     */
    private Stack<Integer> stack1;

    /**
     * 数据弹出
     */
    private Stack<Integer> stack2;

    public NewQueue() {
        this.stack1 = new Stack<Integer>();
        this.stack2 = new Stack<Integer>();
    }

    /**
     * 
     * 函数功能描述:队列添加数据
     * @date 2018年9月8日下午3:54:18
     * @param data void
     * @author taomeng
     */
    public void add(Integer data) {
        stack1.push(data);
    }

    /**
     * 
     * 函数功能描述:返回头部元素并移除
     * @date 2018年9月8日下午4:21:12
     * @return int
     * @author taomeng
     */
    public int poll() {
        if (stack1.isEmpty() && stack2.isEmpty()) {
            throw new ProgramException("queue is empty.");
        } else if (stack2.isEmpty()) {
            while(!stack1.isEmpty()) {
                stack2.push(stack1.pop());
            }   
        }
        return stack2.pop();    
    }

    /**
     * 
     * 函数功能描述:数据弹出,返回头部元素
     * @date 2018年9月8日下午4:44:12
     * @return int
     * @author taomeng
     */
    public int peek() {
        if (stack1.isEmpty() && stack2.isEmpty()) {
            throw new ProgramException("queue is empty.");
        } else if (stack2.isEmpty()) {
            while(!stack1.isEmpty()) {
                stack2.push(stack1.pop());
            }
        }       
        return stack2.peek();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕枫技术笔记

您的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值