一、题目
需要实现一个类,使用两个栈实现队列的基本操作,包括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(); } }