微信扫一扫打赏支持

算法疑难(js实现)---3、两个栈来实现一个队列

算法疑难(js实现)---3、两个栈来实现一个队列

一、总结

一句话总结:

栈1做入队操作,栈2做出队操作
let stack1=[];//入队操作
let stack2=[];//出队操作

//队列的入队操作
function push(node){
    //只需要非常简单的往栈1里面push元素就好
    stack1.push(node);
}

//队列的出队操作
function pop() {
    //1、把栈1里面的元素挪到栈2里面(负负得正)
    while(stack1.length){
        stack2.push(stack1.pop());
    }
    //2、把栈2顶端的数据出栈即可
    let popVal=stack2.pop();
    //3、将栈2里面的数据挪到栈1里面(还原数据(恢复):方便我们做后续的入队操作和出队操作)
    while(stack2.length){
        stack1.push(stack2.pop());
    }
    return popVal;
}

 

 

1、两个栈实现队列的理论基础是什么?

第一个栈将元素倒过来了,第二个栈又将第一个栈的元素倒过来了,这样【负负得正】,就可以实现按照入队序列来出队元素,也就是先进先出

 

 

2、两个栈实现队列的算法思路?

栈1做入队操作,栈2做出队操作

 

3、两个栈实现队列的入队操作和出队操作的算法流程?

入队操作算法流程:只需要非常简单的往栈1里面push元素就好
出队操作算法流程:1、把栈1里面的元素挪到栈2里面(负负得正)
出队操作算法流程:2、把栈2顶端的数据出栈即可
出队操作算法流程:3、将栈2里面的数据挪到栈1里面(还原数据(恢复):方便我们做后续的入队操作和出队操作)

 

入队操作算法流程:
只需要非常简单的往栈1里面push元素就好

出队操作算法流程:
1、把栈1里面的元素挪到栈2里面(负负得正)
2、把栈2顶端的数据出栈即可
3、将栈2里面的数据挪到栈1里面(还原数据(恢复):方便我们做后续的入队操作和出队操作)

let stack1=[];//入队操作
let stack2=[];//出队操作

//队列的入队操作
function push(node){
    //只需要非常简单的往栈1里面push元素就好
    stack1.push(node);
}

//队列的出队操作
function pop() {
    //1、把栈1里面的元素挪到栈2里面(负负得正)
    while(stack1.length){
        stack2.push(stack1.pop());
    }
    //2、把栈2顶端的数据出栈即可
    let popVal=stack2.pop();
    //3、将栈2里面的数据挪到栈1里面(还原数据(恢复):方便我们做后续的入队操作和出队操作)
    while(stack2.length){
        stack1.push(stack2.pop());
    }
    return popVal;
}

 

 

 

 

 

二、两个栈来实现一个队列

博客对应课程的视频位置:3、两个栈来实现一个队列
https://www.fanrenyi.com/video/20/239

 

 

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>两个栈来实现一个队列</title>
 6 </head>
 7 <body>
 8 <!--
 9 需求:
10 用两个栈来实现一个队列,完成队列的Push和Pop操作。
11 队列中的元素为int类型。
12 
13 栈和队列的基本特性:
14 栈:先进后出(后进先出)
15 队列:先进先出
16 
17 两个栈实现队列的理论基础是什么
18 栈的操作相对于原来的数据的入栈操作,相当于是对数据倒着来了
19 第一个栈将元素倒过来了,第二个栈又将第一个栈的元素倒过来了,
20 这样【负负得正】,就可以实现按照入队序列来出队元素,也就是先进先出
21 
22 算法思路:
23 栈1做入队操作,栈2做出队操作
24 
25 入队操作和出队操作的算法流程:
26 入队操作算法流程:
27 只需要非常简单的往栈1里面push元素就好
28 
29 出队操作算法流程:
30 1、把栈1里面的元素挪到栈2里面(负负得正)
31 2、把栈2顶端的数据出栈即可
32 3、将栈2里面的数据挪到栈1里面(还原数据(恢复):方便我们做后续的入队操作和出队操作)
33 
34 
35 实例:
36 1,2,3,4,5入队
37 出队操作 1
38 入队6
39 出队操作 2
40 出队操作 3
41 
42 js里面用数组模拟栈非常方便
43 因为js的Array提供了push方法(入栈操作)和pop方法(出栈操作)
44 
45 -->
46 <script>
47     let stack1=[];//入队操作
48     let stack2=[];//出队操作
49 
50     //队列的入队操作
51     function push(node){
52         //只需要非常简单的往栈1里面push元素就好
53         stack1.push(node);
54     }
55 
56     //队列的出队操作
57     function pop() {
58         //1、把栈1里面的元素挪到栈2里面(负负得正)
59         while(stack1.length){
60             stack2.push(stack1.pop());
61         }
62         //2、把栈2顶端的数据出栈即可
63         let popVal=stack2.pop();
64         //3、将栈2里面的数据挪到栈1里面(还原数据(恢复):方便我们做后续的入队操作和出队操作)
65         while(stack2.length){
66             stack1.push(stack2.pop());
67         }
68         return popVal;
69     }
70 
71     /*
72     1,2,3,4,5入队
73     出队操作 1
74     入队6
75     出队操作 2
76     出队操作 3
77     * */
78 
79     push(1);
80     push(2);
81     push(3);
82     push(4);
83     push(5);
84     console.log(pop());
85     push(6);
86     console.log(pop());
87     console.log(pop());
88 
89 </script>
90 </body>
91 </html>

 

 

 

 

 

 

 

 

posted @ 2020-05-18 19:44  范仁义  阅读(436)  评论(0编辑  收藏  举报