博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试题7-用两个栈实现队列
阅读量:5119 次
发布时间:2019-06-13

本文共 1994 字,大约阅读时间需要 6 分钟。

面试题7-用两个栈实现队列

基础知识

栈是一种非常常见的数据结构,特点是后入先出,即最后被压入栈的元素会被第一个弹出。栈在计算机领域的应用广泛,举了例子:在操作系统中,操作系统会给每个线程创建一个栈来存储函数调用时各个函数的参数、返回地址临时变量等。通常栈是一个不考虑排序的数据结构,需要O(n)的时间才能找到栈中最大或者最小的元素。

队列是另外一种很重要的数据结构。队列的特点是先进先出,即第一个进入队列的元素将会第一个出来。队列的应用场景也很广泛:在树的层次遍历中可以利用队列这种数据结构,把每一层的子结点都放入到队列中,就可以按照顺序去一层一层的遍历。
栈和队列虽然是两种截然不同的数据结构,但是他们却相互联系,可以使用栈来实现队列,也可以用队列来实现栈。

题目

使用两个栈来实现一个队列,完成队列的Push和Pop操作。队列中的元素为int类型。

解题思路及代码

栈的特点是后进先出,而队列的特点是先进先出。所以这道题的难点是完成两种顺序的转换。

入队:将元素进栈A

出队:判断栈B是否为空,如果为空,则将栈A中所有元素pop,并push进栈B,栈B出栈;
如果不为空,栈B直接出栈

  1. import java.util.Stack; 

  2.  

  3. public class Solution

  4. Stack<Integer> stack1 = new Stack<Integer>(); 

  5. Stack<Integer> stack2 = new Stack<Integer>(); 

  6.  

  7. public void push(int node)

  8. stack1.push(node); 


  9.  

  10. public int pop()

  11. if(stack2.isEmpty()){ 

  12. while(!stack1.isEmpty()){ 

  13. int tmp = stack1.pop(); 

  14. stack2.push(tmp); 



  15. return stack2.pop(); 



扩展

使用两个队列实现一个栈

  • 解题思路
    入栈: 将元素放入队列A中
    出栈: 判断队列A中的元素的个数是否为1,如果等于1就出队列,否则把A中的元素出队列,然后把出队列的元素放入到B中,直到队列A中只剩下最后一个元素,然后队列A出队列。这样就完成了出栈的操作,但是原来的元素怎么处理呢?有两种思路:
    1. 把队列A的引用指向队列B的实例,把队列B的引用指向队列A的实例,即交换实例
    2. 把队列B中的元素出队列到A中
  • 代码实现:
  1. import java.util.LinkedList; 

  2.  

  3. public class StackByTwoQueue

  4.  

  5. private LinkedList<String> queue1 = new LinkedList<String>(); 

  6. private LinkedList<String> queue2 = new LinkedList<String>(); 

  7.  

  8. /* 

  9. * 两个队列实现一个栈 

  10. * pop完成出栈操作,push完成入栈操作 

  11. */ 

  12. public void push(String obj)

  13. if(queue1.isEmpty()){ 

  14. queue2.add(obj); 


  15. if(queue2.isEmpty()){ 

  16. queue1.add(obj); 



  17. public String pop()

  18. //两个栈都为空时,没有元素可以弹出 

  19. if (queue1.isEmpty()&&queue2.isEmpty()) { 

  20. try

  21. throw new Exception("stack is empty"); 

  22. } catch (Exception e) { 



  23. if(queue1.isEmpty()){ 

  24. while(queue2.size()>1){ 

  25. queue1.add(queue2.poll()); 


  26. return queue2.poll(); 


  27. if(queue2.isEmpty()){ 

  28. while(queue1.size()>1){ 

  29. queue2.add(queue1.poll()); 


  30. return queue1.poll(); 


  31. return null


  32.  

  33. public static void main(String[] args)

  34. StackByTwoQueue stack = new StackByTwoQueue(); 

  35. for(int i=0;i<10;i++){ 

  36. stack.push(i+""); 


  37. for(int i=0;i<20;i++){ 

  38. System.out.println(stack.pop()); 



  39.  


  40.  

转载于:https://www.cnblogs.com/chailinbo/p/8421955.html

你可能感兴趣的文章
window添加右键菜单
查看>>
Window7上搭建symfony开发环境(PEAR)
查看>>
Linux内核态、用户态简介与IntelCPU特权级别--Ring0-3
查看>>
第23月第24天 git命令 .git-credentials git rm --cached git stash clear
查看>>
java SE :标准输入/输出
查看>>
一些方便系统诊断的bash函数
查看>>
jquery中ajax返回值无法传递到上层函数
查看>>
css3之transform-origin
查看>>
Master选举原理
查看>>
[ JAVA编程 ] double类型计算精度丢失问题及解决方法
查看>>
小别离
查看>>
好玩的-记最近玩的几个经典ipad ios游戏
查看>>
PyQt5--EventSender
查看>>
Sql Server 中由数字转换为指定长度的字符串
查看>>
Java 多态 虚方法
查看>>
万能的SQLHelper帮助类
查看>>
tmux的简单快捷键
查看>>
[Swift]LeetCode922.按奇偶排序数组 II | Sort Array By Parity II
查看>>
《绿色·精简·性感·迷你版》易语言,小到不可想象
查看>>
Android打包key密码丢失找回
查看>>