两个栈实现队列(经典面试题)java
来源:互联网 发布:ubuntu翻墙上google 编辑:程序博客网 时间:2024/05/23 21:43
问题描述:用两个栈实现队列的基本方法,比如向队尾添加元素(offer)、获取队头元素(peek)、获取并删除队头元素(poll)。
解决思路:栈是先进后出的结构。比如1、2、3顺序进栈,出栈顺序是3、2、1。如果3、2、1顺序进栈,然后依次出栈的顺序就是1、2、3。可以发现把一个栈中的元素依次出栈并存放到另一个栈中,那么出栈的顺序就是队列的顺序。这里注意一定要把一个栈中元素全部存放到另一个栈中才可以。
只要保证数据存放时存放在一个栈中,每次获取数据都从这个栈中把数据导入另一个栈,就可以保证数据按照先入先出的顺序输出了。如果有两个栈v1和v2。如果保证数据都存放在v1中,每次获取数据时把v1的数据全部存放到v2中,由v2获取数据,获取数据之后在把v2中的数据写回v1(保证数据按照栈的结构存放)。每次插入数据时只要向v1中插入数据,就可以保证数据存放的栈结构。
上面做法看着很好(我面试时就这么写的),但有一个缺点,每次查询完都要讲v2中的数据存回v1中,浪费大量的时间。是不是可以不用回存呢。仔细观察就会发现v2中的数据顺序出栈,就是队列顺序输出的结果。只要v2中有数据从v2中出栈就可以了,v2中没数据了,才把v1的数据全部压入v2。代码如下:
import java.util.Stack;import java.util.LinkedList;import java.util.Queue;import java.util.Random;class MyQueue<E>{ Stack<E> v1 = new Stack<E>(); Stack<E> v2 = new Stack<E>(); //返回并删除首元素 public E poll(){ if(v2.isEmpty()){ while(!v1.isEmpty()){ v2.push(v1.pop()); } } if(v2.isEmpty()) return null; return v2.pop(); } //返回首元素,不删除 public E peek(){ if(v2.isEmpty()){ while(!v1.isEmpty()){ v2.push(v1.pop()); } } if(v2.isEmpty()) return null; return v2.peek(); } //添加元素 public boolean offer(E e){ v1.push(e); return true; }}public class Main { //测试 public static void main(String[] args) { Queue<Integer> que = new LinkedList<>(); MyQueue<Integer> myque = new MyQueue<>(); Random ra =new Random(); for(int i=0;i<100000;i++) { int k = ra.nextInt()+1; if(k%3 == 0){ que.offer(k); myque.offer(k); } else if(k%3 == 1){ Integer n = que.poll(); Integer m = myque.poll(); if(n!=m && !n.equals(m)) System.out.println(n+" != "+m); } else{ Integer n = que.peek(); Integer m = myque.peek(); if(n!=m && !n.equals(m)) System.out.println(n+" != "+m); } } }}
阅读全文
0 0
- 两个栈实现队列(经典面试题)java
- 经典面试题一:用两个栈实现一个队列
- 面试题7:用两个栈实现队列(java)
- 剑指Offer面试题7(Java版):用两个栈实现队列与用两个队列实现栈
- 剑指Offer面试题7(Java版):用两个栈实现队列与用两个队列实现栈
- 面试题整理-两个栈实现队列
- 面试题7 两个栈实现队列
- 面试题-----两个栈实现一个队列
- 面试题 两个队列实现栈
- 剑指Offer:面试题7——用两个栈实现队列(java实现)
- 剑指offer面试题7(java实现):用两个栈实现队列
- 剑指offer面试题7:用两个栈实现队列(Java实现)
- 两个栈实现队列 (面试题 7)
- 面试题(两个栈实现一个队列和两个队列实现一个栈)
- 【经典面试题】两个栈模拟一个队列
- 栈&队列面试题之两个队列实现一个栈
- 剑指offer--面试题7:用两个栈实现队列--Java实现
- 剑指Offer面试题7:用两个栈实现队列 Java实现
- 【Scikit-Learn 中文文档】交叉分解
- 13. Roman to Integer
- Can't create cache file
- 外汇品牌B&G GLOBAL MARKETS强势入驻中国 瞬间成为同行话题热点
- TensorBoard 简介及使用流程
- 两个栈实现队列(经典面试题)java
- 泛型约束(值类型和引用类型)
- 【教程】FileAudit入门的基本要求
- 有关Android平台的jni 和 .mk文件
- 如何读懂awr
- 欢迎使用CSDN-markdown编辑器
- Java爬虫那些事---下载分析
- 磁盘分区,文件在磁盘上的存储
- 《高性能MySQL》读书笔记