1.两个栈实现一个队列:
思路一、s1是入栈的,s2是出栈的
入队列:直接压到s1里
出队列:先把s1中的元素全部压到s2中,弹出s2中的栈顶元素;
再把s2的所有元素压回s1中
思路二、s1是入栈的,s2是出栈的
入队列:如果s1为空,把s2中所有元素压到s1中;否则直接压入s1
出队列:如果s2不为空,把s2的栈顶元素直接弹出;否则把s1所有
元素全部弹出压入s2中,再弹出s2栈顶元素
思路三、s1是入栈的,s2是出栈的
入队列:直接压入s1即可
出队列:如果s2不为空,把s2中的栈顶元素直接弹出;否则把s1
的所有元素全部弹出压入s2中,再弹出s2的栈顶元素
#include <iostream>
#include <stack>
using namespace std;
template <typename T> class CQueue
{
public:
CQueue()
{}
~CQueue()
{}
void appendTail(const T& node)
{
s1.push (node);
cout<<node<<"->";
}
T deleteHead()
{
if(s2.size () <= 0)
{
while(s1.size () > 0)
{
T& data = s1.top ();
s1.pop ();
s2.push (data);
}
}
if(s2.size () == 0)
cout<<"队列为空!"<<endl;
T head = s2.top ();
s2.pop ();
cout<<head<<"->";
return head;
}
private:
stack<T> s1;
stack<T> s2;
};
int main()
{
CQueue<int> q;
cout<<"原队列:"<<endl;
q.appendTail (1);
q.appendTail (2);
q.appendTail (3);
q.appendTail (4);
cout<<endl;
cout<<"出队列元素:";
q.deleteHead ();
cout<<endl;
cout<<"插入队列元素:"<<endl;
q.appendTail (5);
q.appendTail (6);
q.appendTail (7);
cout<<endl;
cout<<"出队列元素:";
q.deleteHead ();
q.deleteHead ();
q.deleteHead ();
q.deleteHead ();
cout<<endl;
return 0;
}
2.两个队列实现一个栈
算法思路:
现有两个队列q1与q2,入栈:如果q1与q2都为空,那么我们选择q1入栈也就是入队列,比如q1入栈 1 2 3 4 ;现在要出栈,后进先出那么4要出栈。但是q1是一个队列,先进先出,那么 1 2 3出队列 q2 1 2 3 入队列,q1中此时剩余4,把4出对列达到出栈的效果。 这个时候如果我们又加入一个元素5,那么我们应该把5放到q1还是q2,因为现在q2中有 1 2 3,把5放到q1不方便统计,所以要把5放入到q2;如果5放到了q1,等下编写出栈的代码很麻烦,如果放到q2我们只需要分类:q2是不是为空,为空的为一种情况,不为空的为一种情况。
所以最后:
如果q1与q2都为空,那么往q1中插入元素
如果q1不为空,那么往q1中插入元素
如果q2不为空,那么往q1中插入元素
#include <iostream>
#include <queue>
using namespace std;
template <class T>
class CStack
{
public:
CStack()
{}
~CStack()
{}
void appendTail(const T& node)
{
if(q1.size ()==0 && q2.size () == 0)//如果q1与q2都为空,那么往q1中插入元素
q1.push (node);
else if(q1.size () > 0)//如果q1不为空,那么往q1中插入元素
q1.push (node);
else if(q2.size()>0)//如果q2不为空,那么往q1中插入元素
q2.push(node);
cout<<node<<"->";
}
T deleteTail()
{
T Tail;
if(q2.size () == 0)
{
while(q1.size () != 1)
{
T& data = q1.front ();
q1.pop ();
q2.push (data);
}
Tail = q1.front ();
q1.pop ();
cout<<Tail<<endl;
}
return Tail;
}
private:
queue<T> q1;
queue<T> q2;
};
int main()
{
CStack<int> s;
s.appendTail (1);
s.appendTail (2);
s.appendTail (3);
s.appendTail (4);
s.appendTail (5);
s.appendTail (6);
s.deleteTail ();
s.deleteTail ();
return 0;
}