栈:先进后出
队列:后进先出
方法一:
如何用两个队列实现一个栈呢?我们可以把一个队列里面的内容放入第二个队列里面,此时要剩余一个,这剩下的一个可以直接出栈,再把队列2里面的元素放回队列1, 重复即可达到栈的要求
#include<iostream>
#include <queue>
using namespace std;
template <typename T>
class Cstack
{
public:
Cstack(void)
{}
~Cstack(void)
{}
void appendTail(const T&node);
T deleteHead();
private:
queue<T> queue1;
queue<T> queue2;
};
template<class T>
void Cstack<T>::appendTail(const T& node)
{
if (!queue1.empty())
{
queue1.push(node);
}
else
{
queue2.push(node);
}
}
template<class T>
T Cstack<T>::deleteHead()
{
int ret = 0;
if (queue1.empty())
{
int i = queue2.size();
while (i > 1)//将q2队列中的数据pop到只剩一个
{
queue1.push(queue2.front());
queue2.pop();
--i;
}
ret = queue2.front();
queue2.pop();
}
else
{
int i = queue1.size();
while (i > 1)
{
queue2.push(queue1.front());
queue1.pop();
--i;
}
ret = queue1.front();
queue1.pop();
}
return ret;
}
int main() {
Cstack<int> q1;
q1.appendTail(1);
q1.appendTail(2);
q1.appendTail(3);
q1.appendTail(4);
q1.deleteHead();
q1.deleteHead();
q1.deleteHead();
q1.deleteHead();
return 0;
}
方法二(感觉这样时间复杂度会降低):
还可以队列q1,q2
第一次进栈,压入q1
第二次压入q2,然后把q1的元素出队也压入q2
第三次再压入q1,然后把q2的都出队压入q1,
第四次压入q2 。。。。以此类推
每次压入那个空的队列,然后把另一个队列的都出队也压入这个队列
第一次 q1: 【1】 q2:【】
第二次q1:【】 q2【2, 1】
第三次q1:【3 2 1】 q2【】
依次类推。