特性
栈的特性:后进先出
队列的特性:先进先出
解析
用两个栈实现队列,其实就是通过组合两个栈,一个作为入队栈,一个作为出队栈。
入队
这里将栈1当作入队栈:
void push(const T &data)
{
stack1.push(data);
}
出队
将栈2作为出队栈:
void Pop()
{
//如果两个栈都是空栈,此时说明队列是空的
if (stack1.empty() && stack2.empty())
{
cout << "this queue is empty" << endl;
}
//如果栈2中有元素,那出队列就出栈2中的
if (!stack2.empty())
{
stack2.pop();
}
//此时表明栈2已是空栈,再要出队列的话,那就需要把栈1中的所有元素入栈到栈2中
else
{
while (stack1.size() > 0)
{
stack2.push(stack1.top());
stack1.pop();
}
stack2.pop();
}
}
带返回值的Pop函数:
T &Pop()
{
T head;
//如果两个栈都是空栈,此时说明队列是空的
if (stack1.empty() && stack2.empty())
{
cout << "this queue is empty" << endl;
}
//如果栈2中有元素,那出队列就出栈2中的
if (!stack2.empty())
{
head = stack2.top();
stack2.pop();
}
//此时表明栈2已是空栈,再要出队列的话,那就需要把栈1中的所有元素入栈到栈2中
else
{
while (stack1.size() > 0)
{
stack2.push(stack1.top());
stack1.pop();
}
head = stack2.top();
stack2.pop();
}
return head;
}
获取队头元素
队列的队头位于出队栈(栈2)的栈顶,只要栈2不空,就返回栈2的栈顶元素。如果栈2为空,那就把栈1中的所有元素全部压入栈2中,再取栈顶:
T &Front()
{
//获取队头元素,此时队头位于栈2的栈顶
assert(!stack1.empty() || !stack2.empty());
if (stack2.empty())
{
while (!stack1.empty())
{
stack2.push(stack1.top());
stack1.pop();
}
}
return stack2.top();
}