• 每日一题 为了工作 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();
    	}
    	
    }
    

      

  • 相关阅读:
    助力APP尽情“撒币”!阿里云正式上线移动直播问答解决方案
    Linux API的fork()测试
    完美搞定《DOCKER IN ACTION》第二章示例
    docker+python无头浏览器爬虫
    阿里云播放器SDK的正确打开方式 | Aliplayer Web播放器介绍及功能实现(三)
    11月9日云栖精选夜读:阿里90后工程师_如何用AI程序写出双11打call歌?
    知名网站的 404 页面长啥样?你的404长啥样?
    10月24日云栖精选夜读:2017杭州•云栖大会完美收官 虚拟化平台精彩回顾
    memcache漏洞你补上了吗
    5分钟用Jitpack发布开源库
  • 原文地址:https://www.cnblogs.com/walxt/p/12408675.html
Copyright © 2020-2023  润新知