-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathStackUsing2Queues.cpp
180 lines (120 loc) · 3.09 KB
/
StackUsing2Queues.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#include<iostream>
#include<queue>
using namespace std;
//IMPLEMENTING STACK USING 2 QUEUES
queue<int> q1;
queue<int> q2;
class Stack {
public:
void Push(int data); //Takes-O(1) time complexity
void Pop();//-Takes -O(n)- time complexity- as we transfer n items from Queue1 to Queue2
void Top();
};
void Stack::Push(int data) {
if(q1.empty()) {
q2.push(data); //if queue 1 is empty, then enqueue data to queue 2
}
else { //otherwise enqueue data to queue1
q1.push(data);
}
}
void Stack::Pop() {
int i=0,size;
if(q1.empty() && q2.empty()) {
cout<<"The stack is empty"<<endl;
return;
}
if(q2.empty()) { //case if queue1 is not empty
size= q1.size();
while(i < q1.size()-1 ) //transfer n-1 items from queue1(storage Queue) to queue2(temporary queue)
{
q2.push(q1.front()); //enqueue n-1 items from Queue 1 to Queue2
q1.pop();
i++;
}
cout<<"Deleted "<<q1.front()<<" from top."<<endl; //queue1 now has only 1 item-which will be popped in LIFO fashion
q1.pop();
}
else {
size=q2.size();
while(i < size-1) { //transfer n-1 items from Q2(storage queue) to Q1(temp queue)
q1.push(q2.front()); //enqueue n-1 items from Queue2 to Queue1
q2.pop();
i++;
}
cout<<"Deleted "<<q2.front()<<" from top."<<endl; // Queue2 now has only 1 item which is popped
q2.pop();
}
}
void Stack::Top() {
int i=0,size,front;
if(q1.empty() && q2.empty()) {
cout<<"The stack is empty"<<endl;
return ;
}
if(q2.empty()) { //case if queue1 is not empty
size= q1.size();
while(i < q1.size()-1 ) //transfer n-1 items from queue1(storage Queue) to queue2(temporary queue)
{
q2.push(q1.front()); //enqueue n-1 items from Queue 1 to Queue2
q1.pop();
i++;
}
front=q1.front(); //storing last element of storage queue Q1 in front
cout<<"Top of stack is "<<front<<endl;
//inserting last element of Q1 to Q2
q2.push(q1.front());
q1.pop();
//now again transfer all back to storage queue Q1(storage queue) and make Q2 empty,for the condition of this block to be true
while(!q2.empty()) {
q1.push(q2.front()); //
q2.pop();
}
//now Q2(temp queue is again empty)
}
else {
size=q2.size();
while(i < size-1) { //transfer n-1 items from Q2(storage queue) to Q1(temp queue)
q1.push(q2.front()); //enqueue n-1 items from Queue2 to Queue1
q2.pop();
i++;
}
front = q2.front();
cout<<"Top of stack is "<<front<<endl;
//insert the last item in Q2(storage queue) to Q1(temp queue)
q1.push(q2.front());
q2.pop();
//now again transfer all items back to Q2(storage queue) and make Q1 empty
while(!q1.empty()) {
q2.push(q1.front()); //
q1.pop();
}
}
}
int main()
{
Stack s;
int choice,data;
while(1)
{
cout<<"\n1)Insert\n2)Delete\n3)Top of stack\n4)Exit\n"<<endl;
cin>>choice;
switch(choice) {
case 1:
cout<<"Enter data :"<<endl;
cin>>data;
s.Push(data);
break;
case 2:
s.Pop();
break;
case 3:
s.Top();
break;
default:
exit(0);
break;
}
}
return 0;
}