两个栈实现一个队列,本质上是用两个栈去模拟队列的入队和出队。
写程序时无需死记,画个示意图推一下就好:
stack1,和stack2 去模拟,入队时只在stack1 中将元素入栈, 出队时只将stack2的栈顶元素出队,出队时 1)首先判断stack2 是否为空,若stack2 为空将则将stack1中的所有元素弹出压入stack2 2)此时再判断栈2是否为空,若为空则抛出异常,不为空则将stack2的栈顶元素弹出
两个队列实现一个栈,本质上是用两个队列去模拟栈的入栈和出栈。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<stack>
#include<queue>
using namespace std;
//两个队列实现一个栈
template<class T> class myStack
{
public:
myStack(){}
~myStack(){}
void push(const T&element);
T pop();
private:
queue<T> queue1;
queue<T> queue2;
};
template<class T> void myStack<T>::push(const T&element)
{
if(!queue2.empty())//正常情况下两个队列必定是有一个队列为空另一个队列不为空,入栈操作时只允许数据往有数据的队列中入队。始终保持两个队列一个为空一个不为空
{
queue2.push(element);
}
else
{
queue1.push(element);
}
}
template<class T>T myStack<T>::pop()
{
if(!queue2.empty())//正常情况下两个队列必定是有一个队列为空另一个队列不为空,即两个队列交替为空
{
while(queue2.size()!=1)
{
T top=queue2.front();
queue2.pop();
queue1.push(top);
}
T deletedElement=queue2.front();
queue2.pop();
return deletedElement;
}
else
{
while(queue1.size()!=1)
{
T top=queue1.front();
queue1.pop();
queue2.push(top);
}
T deletedElement=queue1.front();
queue1.pop();
return deletedElement;
}
}
//两个栈实现一个队列
template<class T> class myqueue
{
public:
myqueue(){};
void push(const T& node);
T pop();
~myqueue(){};
bool empty();
private:
stack<T> stack1;//栈stack1模拟入队时用
stack<T> stack2;//栈stack2模拟出队时用
};
template<class T> void myqueue<T>::push(const T&node)
{
stack1.push(node);
}
template<class T> T myqueue<T>::pop()
{
if(stack2.empty())//栈stack2 为空时要判断栈1中是否有元素,有的话则全部出栈进而压入栈stack2 中
{
while(!stack1.empty())
{
T temp=stack1.top();
stack1.pop();
stack2.push(temp);
}
}
if(stack2.empty())
{
throw exception("the queue is empty()");
}
T head=stack2.top();
stack2.pop();
return head;
}
template<class T> bool myqueue<T>::empty()
{
if(stack1.empty()&&stack2.empty())//两个栈都为空则表示队列为空
{
return true;
}
else
{
return false;
}
}
int main()
{
//两个栈实现一个队列
myqueue<int> test;
for(int i=0;i<10;i++)
{
test.push(i);
}
while(!test.empty())
{
cout<<test.pop()<<" ";
}
//两个队列实现一个栈
cout<<endl;
myStack<int> stackTest;
for(int i=0;i<10;i++)
{
stackTest.push(i);
}
for(int i=0;i<5;i++)
{
int temp=stackTest.pop();
cout<<temp<<" ";
}
return 0;
}