两个队列实现一个栈
题目描述:
利用两个队列实现一个栈,实现先进后出的功能。
算法实现:
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数据时需要将有数据的队列的数据存入空的队列,让有数据的队列只剩一个数据就可弹出。具体可以观察代码更加明确。