首页 > 技术文章 > 两个队列实现一个栈

dormant 2016-03-24 20:05 原文

题目描述:

  利用两个队列实现一个栈,实现先进后出的功能。

算法实现:

 1 #include<iostream>
 2 #include<queue>
 3 using namespace std;
 4 
 5 queue<int> q1;
 6 queue<int> q2;
 7 
 8 void append(const int &data) {                            //实现栈的Push功能
 9     if(q1.size() == 0 && q2.size() == 0){                 //如果两个队列都空,则将数据push进q1.
10         q1.push(data);
11     }
12     else if(q1.size() > 0){                               //如果q1非空则将数据push进q1
13         q1.push(data);
14     }
15     else if(q2.size() > 0){                               //如果q2非空则将数据push进q2
16         q2.push(data);
17     }
18 }
19 
20 int getData(){                                             //实现从栈中取数据
21     
22     if(q1.empty() == 1 && q2.empty() == 1){                //如果两个队列都空,则返回-1
23         return -1;
24     }
25     
26     if(q1.empty() == 1){                                    //如果q1为空,则将q2中的数据存入q1中,当q2只剩一个数据时,则输出这个数据
27         while(q2.size() != 1){
28             int &num = q2.front();
29             q1.push(num);
30             q2.pop();
31         }
32         int s = q2.front();
33         q2.pop();
34         return s;
35     }
36     
37     if(q2.empty() == 1){                                    //同理如果q2为空,则将q1中的数据存入q2中,当q2只剩下一个数据时,则输出这个数据
38         while(q1.size() != 1){
39             int &num = q1.front();
40             q2.push(num);
41             q1.pop();
42         }
43         int s = q1.front();
44         q1.pop();
45         return s;
46     }
47 }
48 
49 int main(){                                                 //测试程序:输入PUSH时 再输入数字表示压栈    输入POP 时表示弹栈。如果有值就输出数据,没有则输出-1
50     int num; 
51     string str;
52     int x;
53     
54     cin>>num;
55     while(--num > 0){
56         cin>> str;
57         if(str == "PUSH"){
58             cin>>x;
59             append(x);
60         }
61         
62         if(str == "POP"){
63             int p = getData();
64             if(p < 0){
65                 cout<< "-1" << endl;
66             }
67             else 
68             {
69                 cout<<p<<endl;
70             }
71         }
72     }
73     
74     return 0;
75 }

算法思想:

  我们知道两个队列实现一个栈,其中队列的机制是先进先出,栈的机制是先进后出;那么我们需要驳斥一个队列为空,如果pop数据时需要将有数据的队列的数据存入空的队列,让有数据的队列只剩一个数据就可弹出。具体可以观察代码更加明确。

推荐阅读