算法-栈和队列:用队列组成栈
使用队列(单向队列)实现栈的下列操作:
- pop():弹出栈顶元素。
- push(x):将x入栈。
- top():获取栈顶元素。
- empty():返回栈是否为空。
方法一:使用两个队列实现栈
#include <iostream>
#include <queue>
using namespace std;
class MyStack{
public:
queue<int> quIn;
queue<int> quOut;//纯纯用来备份的
//- push(x):将x入栈。
void push(int x){
quIn.push(x);
}
//- pop():弹出栈顶元素。
int pop(){
int res;
int size = quIn.size();
size--;
while (size--) { //将quIn导入quOut,但是要留下最后一个元素
quOut.push(quIn.front());
quIn.pop();
}
res = quIn.front();
quIn = quOut;
return res;
}
//- top():获取栈顶元素。
int top(){
return quIn.back();
}
//- empty():返回栈是否为空。
bool empty(){
return quIn.empty();
}
};
int main(){
MyStack mySt;
mySt.push(1);
mySt.push(2);
mySt.push(3);
mySt.push(4);
cout<<"myQue.empty()=="<<mySt.empty()<<endl;
cout<<"myQue.pop()=="<<mySt.pop()<<endl;
cout<<"myQue.peek()=="<<mySt.top()<<endl;
mySt.pop();
mySt.pop();
mySt.pop();
cout<<"myQue.empty()=="<<mySt.empty()<<endl;
}
方法二:使用一个队列实现栈。
和方法一的差别在与pop函数,方法二采用的策略是将前面的元素重新进入一次队列。
#include <iostream>
#include <queue>
using namespace std;
class MyStack{
public:
queue<int> quIn;
//- push(x):将x入栈。
void push(int x){
quIn.push(x);
}
//- pop():弹出栈顶元素。将前面的元素重新进入队列
int pop(){
int res;
int size = quIn.size();
size--;
while (size--) {
quIn.push(quIn.front());
quIn.pop();
}
res = quIn.front();
return res;
}
//- top():获取栈顶元素。
int top(){
return quIn.back();
}
//- empty():返回栈是否为空。
bool empty(){
return quIn.empty();
}
};
int main(){
MyStack mySt;
mySt.push(1);
mySt.push(2);
mySt.push(3);
mySt.push(4);
cout<<"myQue.empty()=="<<mySt.empty()<<endl;
cout<<"myQue.pop()=="<<mySt.pop()<<endl;
cout<<"myQue.peek()=="<<mySt.top()<<endl;
mySt.pop();
mySt.pop();
mySt.pop();
cout<<"myQue.empty()=="<<mySt.empty()<<endl;
}