解法思路:
(1)设置两个队列q1和q2。
(2)栈的push操作:每次往非空队列里插入元素。起初都为空的时候则往q1中插入。
(3)栈的pop操作:把非空队列里除最后一个元素外先转移到另一队列(为空),然后把剩下的
最后一个元素弹出。这样另一个队列便作为下次插入的对象。
(4)以此类推。
注:此过程中,新push进来的元素总是插入到非空队列中,空队列则用来保存pop操作之后的那些元素,那么此时空队列不为空了,原来的非空队列变为空了,总是这样循环。
这样实现的栈的push和pop操作,其时间复杂度为O(n).
#include<iostream>
#include<queue>
using namespace std;
template <class T> class CStack
{
public:
void push_stack(const T &);
T pop_stack();
private:
queue<T> q1;
queue<T> q2;
};
template <class T> void CStack<T>::push_stack(const T &data)
{//每次往不空的队列插入元素,若都为空则往q1插入
q1.size() >= q2.size()?q1.push(data):q2.push(data);
}
template <class T> T CStack<T>::pop_stack()
{
if(q1.size()==0)//如果q1为空
{
while(q2.size()>1)//把q2的除最后一个元素外全部转移到队q1中
{
q1.push(q2.front());
q2.pop();
}
T& front1=q2.front();//取队列头元素
q2.pop();
return front1;
}
else//如果q2为空
{
while(q1.size()>1)//把q1的除最后一个元素外全部转移到队q2中
{
q2.push(q1.front());
q1.pop();
}
T& front2=q1.front();
q1.pop();
return front2;
}
}
int main()
{
CStack<int> s;
s.push_stack(1);
s.push_stack(2);
s.push_stack(3);
cout<<"元素出栈:"<<endl;//后入先出
cout<<s.pop_stack()<<endl;
cout<<s.pop_stack()<<endl;
cout<<s.pop_stack()<<endl;
return 0;
}
本文介绍了一种使用两个队列实现栈的数据结构方法。通过不断在两个队列间转移元素来模拟栈的先进后出特性,实现了栈的push和pop操作。此方法下,push和pop操作的时间复杂度均为O(n)。
451

被折叠的 条评论
为什么被折叠?



