两个栈实现一个队列
实现思路:
- 定义两个栈stack1,stack2。
- stack1存放入队列序列,stack2存放出队列序列。
- 如果进行Push操作,直接对stack1进行操作。
- 如果进行Pop操作,stack2不为空,直接对stack2进行Pop操作,如果stack2为空,将stack1中的数据Push进stack2,然后对stack2进行操作。
整个流程如下图:
先Push 1 2 3,然后进行Pop操作,最后在Push 4。
基于这样的思想,可以写出如下代码:
template <class T>
class CQueue
{
public:
void Push(const T& value)//直接往stack1中push数据
{
stack1.push(value);
}
T Pop()//stack2里存放队列的输出顺序
{
if (stack2.size() <= 0)//如果stack2为空,则将stack1中的说有数据加载到stack2中
{
while (stack1.size() > 0)
{
T value = stack1.top();
stack1.pop();
stack2.push(value);
}
}
if (stack2.size() == 0)
cout<<"The Queue is Empty!\n"<<endl;
T front = stack2.top();//stack2的栈顶元素,对应队头元素
stack2.pop();
return front;
}
private:
stack<T> stack1;
stack<T> stack2;
};
两个队列实现一个栈
实现思路:
两个队列实现一个栈的Pop操作,相比于上面会稍微复杂一点。
- 定义queue1,queue2。
- 对栈进行Push操作时,底层将数据Push到不为空的一个queue。
- 对栈进行Pop操作时,将不为空的一个队列的数据,全部转移到另一个队列中,直至剩下最后一个数据,即要出栈的数据。
结合下面的图示来理解:
先Push 1 2 3,然后Pop, 再Push 4,最后在进行一次Pop的整个过程。
基于这样的思路,可以实现如下代码:
template <class T>
class CStack
{
public:
void Push(const T& value)
{
//往不为空的一个队列中push数据
if (queue1.size() > 0)
queue1.push(value);
else if (queue2.size() > 0)
queue2.push(value);
//如果两个队列都为空,则随便往那个Push都可以的。
else
queue1.push(value);
}
//Pop操作每次都要将数据进行来回移动
T Pop()
{
//q2为空,则将q1的数据除最后一个外,全部转移到q2中,将剩下的有一个pop掉
if (queue2.size() == 0)
{
//最后一个就是待pop的数据
while (queue1.size() > 1)
{
queue2.push(queue1.front());
queue1.pop();
}
T& top = queue1.front();
queue1.pop();
return top;
}
if (queue1.size() == 0)
{
while (queue2.size() > 1)
{
queue1.push(queue2.front());
queue2.pop();
}
T& top = queue2.front();
queue2.pop();
return top;
}
}
private:
queue<T> queue1;
queue<T> queue2;
};
如果有什么遗漏,还望指正,谢谢!