#include <iostream>
#include <stack>
#include <queue>
using namespace std;
//使用两个栈实现队列,实现了push,pop,front操作
//其中栈s2是辅助栈,push直接在s1中插入
//pop从s2中出栈,如果s2是空的,将s1倒进s2,然后再出栈,这样减少了倒栈次数,比较高效。
//front就是s2的top,跟pop类似。
template<typename T> class My_queue{
public:
void push(T t){
s1.push(t);
}
void pop(){
if (s2.empty()){
while (!s1.empty()){
s2.push(s1.top());
s1.pop();
}
}
s2.pop();
}
T front(){
if (s2.empty()){
while (!s1.empty()){
s2.push(s1.top());
s1.pop();
}
}
return s2.top();
}
private:
stack<T> s1;
stack<T> s2;
};
//两个队列实现的栈,实现了push,pop,top
//push 进一个非空的栈,若全空进入q1.
//pop 将前size-1个元素移动到第二个队列,然后最后一个删除
//top 直接是队列的back就可以
template<typename T> class My_stack{
public:
void push(int t){
if (!q2.empty()) q2.push(t);
else q1.push(t);
}
void pop(){
if (!q1.empty()){
while (q1.size()>1){
q2.push(q1.front());
q1.pop();
}
q1.pop();
}
else{
while (q2.size()>1){
q1.push(q2.front());
q2.pop();
}
q2.pop();
}
}
T top(){
if (!q1.empty())
return q1.back();
else if (!q2.empty())
return q2.back();
}
private:
queue<T> q1;
queue<T> q2;
};
int main()
{
My_queue<int> q;
My_stack<int> s;
int a[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (int i = 0; i < 9; i++){
q.push(a[i]);
s.push(a[i]);
}
cout << "My_queue: ";
for (int i = 0; i < 9; i++){
cout << q.front() << " ";
q.pop();
}
cout << endl;
cout << "My_stack: ";
for (int i = 0; i < 9; i++){
cout << s.top() << " ";
s.pop();
}
cout << endl;
return 0;
}