算法:用双队列实现栈

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法:用双队列实现栈相关的知识,希望对你有一定的参考价值。

算法中心思想:

始终向非空队列进行入队操作

初始化时两个队列都为空,我们对q1进行入队操作

 

入栈:

只需执行其中一个队列入队操作即可,

具体操作哪一个队列,用一个标记变量标记 

出栈流程图

技术分享

 

代码实现

 1 package hello;
 2 import java.util.*;
 3 
 4 public class TwoQueueOneStack<E> {
 5     private Queue<E> q1 = new LinkedList<>();
 6     private Queue<E> q2 = new LinkedList<>();
 7     private String pushFlag = "q1";
 8 
 9     public void push(E item){
10         if(pushFlag == "q1"){
11             q1.add(item);
12         }
13         if(pushFlag == "q2"){
14             q2.add(item);
15         }
16     }
17 
18     public E pop(){
19         E top;
20         if(!empty()){
21             if(!q1.isEmpty()) {
22                 top = move(q1, q2);
23                 this.pushFlag = "q2";
24             } else {
25                 top = move(q2, q1);
26                 this.pushFlag = "q1";
27             }
28         }else{
29             throw new ArrayIndexOutOfBoundsException();
30         }
31         return top;
32     }
33 
34     private E move(Queue<E> qSource, Queue<E> qTarget){
35         Iterator<E> it = qSource.iterator();
36         while(it.hasNext()){
37             E item = it.next();
38             if(it.hasNext()){
39                 qTarget.add(item);
40             }else{
41                 qSource.clear();
42                 return item;
43             }
44         }
45 
46         throw new ArrayIndexOutOfBoundsException();
47     }
48 
49     public boolean empty(){
50         if (q1.isEmpty() && q2.isEmpty())
51             return true;
52         else
53             return false;
54     }
55 
56     public static void main(String[] args){
57         TwoQueueOneStack<Integer> tqos = new TwoQueueOneStack<>();
58         for (int i = 0; i < 20; i++) {
59             tqos.push(i);
60         }
61         for (int i = 0; i < 10; i++){
62             System.out.println(tqos.pop());
63         }
64         for (int i = 20; i < 40; i++){
65             tqos.push(i);
66         }
67         for (int i = 0; i < 30; i++){
68             System.out.println(tqos.pop());
69         }
70     }
71 
72 }

 

以上是关于算法:用双队列实现栈的主要内容,如果未能解决你的问题,请参考以下文章

算法_栈实现队列篇

算法_栈实现队列篇

代码随想录算法训练营第10天 | ● 理论基础 ● 232.用栈实现队列 ● 225. 用队列实现栈

⭐算法入门⭐《栈 和 队列》简单02 —— LeetCode 225. 用队列实现栈

算法笔记-数组实现栈,队列

[算法] leetcode栈与队列相关题目详解