每日一题 为了工作 2020 0304 第二题

/**
* 题目:
* 编写一个类,用两个栈实现队列,支持队列的基本操作(add、poll、peek)
* 分析:
* 栈的特点是先进后出,而队列的特点是先进先出,我们可以用两个栈正好能把顺序
* 反过来实现类似队列的操作。
* 具体实现是一个栈作为压入栈,在压入数据时只往这个栈中压入,记为stackPush,
* 另一个栈只作为弹出栈,在弹出数据时只从这个栈弹出,记为stackPop。
* 因为数据压入栈的时候,顺序是先进后出的,那么只要把stackPush的数据在压入
* stackPop中,顺序就变回来了。
* 要求:
* 1.如果stackPush要往stackPop中压入数据,必须一次性把stackPush中的
* 数据全部压入。
* 2.如果stackPop不为空,stackPush绝对不能想stackPop中压入数据。
* @author 雪瞳
*
*/

* 分析 首先明确Java里面队列的基本知识

Queue: 一个队列就是一个先入先出(FIFO)的数据结构,队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。

Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Deque接 口。

* 常用方法

        add        增加一个元索                               如果队列已满,则抛出一个IIIegaISlabEepeplian异常
  remove   移除并返回队列头部的元素      如果队列为空,则抛出一个NoSuchElementException异常
  element  返回队列头部的元素                 如果队列为空,则抛出一个NoSuchElementException异常
  offer       添加一个元素并返回true           如果队列已满,则返回false
  poll         移除并返回队列头部的元素      如果队列为空,则返回null
  peek       返回队列头部的元素                 如果队列为空,则返回null
  put         添加一个元素                                 如果队列满,则阻塞
  take        移除并返回队列头部的元素           如果队列为空,则阻塞

* LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用

* 代码

import java.util.Stack;

public class TwoStacksQueue {
	private Stack<Integer> stackPush;
	private Stack<Integer> stackPop;
	//类的构造方法
	public TwoStacksQueue() {
		this.stackPop = new Stack<>();
		this.stackPush = new Stack<>();
	}
	//添加一个元素
	public void add(int pushInt) {
		//将数据压入栈中
		stackPush.push(pushInt);
	}
	//移除并返问队列头部的元素
	public int poll() {
		if(stackPop.empty() && stackPush.empty()) {
			throw new RuntimeException("Queue is empty!");
		}else if(stackPop.empty()) {
			//当stackPop为空时候才可以向stackPop栈中压入元素
			//stackPush一次压入数据必须将stackP内部的所有数据全部压入
			while(!stackPush.empty()) {
				//获取栈顶数据删除并输出后将元素压入栈stackPop中
				stackPop.push(stackPush.pop());
			}
		}
		return stackPop.pop();
	}
	//返回列表头部元素
	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();
	}
	
}

  

posted @ 2020-03-04 12:09  雪瞳  阅读(151)  评论(0编辑  收藏  举报