- 题目:用两个栈实现一个队列,分别完成在队列尾部插入节点以及在队列头部删除节点的功能。
思路解析:我们通过一个具体的例子来寻找解决这个问题的办法,首先插入元素1我们不妨插入到stack1中,这时候stack2中为空,在压入2,3两个元素。此时栈顶元素是3,stack2仍然是空,队列的特性是先进先出,删除操作删除的元素应该是1,所以我们将stack1的元素全部压入到stack2中此时stack2栈顶的元素就是最先压入的元素1此时将其弹出栈,就完成了队列的删除 操作,下次在需要删除时,stack2栈顶仍是最先插入到队列的元素,直接弹出即可,需要插入的元素仍然插入到stack1中,直到stack2的元素全部弹出,再进行删除操作时又将stack1的元素全部压入到stack2中。因此我们总结出了其中的规律。
.插入时直接插入到stack1中。
.删除时stack2为空,将stack1的元素全部压入到stack2中,否则直接弹出栈顶元素。操作图解:
实现代码:
template <typename T>
class MyQueue
{
public:
void PushBack(const T &data)
{
stack1.push(data);//总是将元素插入到stack1中。
}
void PopFront()
{
if (!stack2.empty())
{
stack2.pop();//如果stack2不为空stack2栈顶的元素就是最先进队列的元素
}
else//否则将stack1的元素压入到stack2中再将stack2栈顶的元素弹出
{
while (!stack1.empty())
{
T &temp = stack1.top();
stack2.push(temp);
stack1.pop();
}
if (!stack2.empty())//注意栈里没有元素的情况
stack2.pop();
}
}
private:
stack<T> stack1;
stack<T> stack2;
};
- 题目:用两个队列实现一个栈,分别完成在栈里插入节点以及在栈顶删除节点的功能。
思路解析:首先queue1中插入元素1,2,3删除元素时栈的操作是后进先出,因此需要删除的元素是3,此时queue1对首元素是1,queue2为空,我们可以依次将queue1的元素压入到queue2中,直到只剩一个元素,此时这个元素正好是最后插入到栈中,需要删除的元素,再要插入时插入到queue2中,删除时我们可以采取同样的方法,我们可以依次将queue2的元素压入到queue1中,这样我们就总结出了相应的规律。
.插入时都为空插入到queue1中,否则插入到不为空的队列中。
.删除时依次将不控的队列中的元素移动到空的队列中,直到剩余一个元素,将其弹出。操作图解
- 实现代码:
template <typename T>
class MyStack
{
public:
void PushBack(const T &data)
{
if (queue1.empty() && queue2.empty())//插入时两个队列都为空插入到queue1中
queue1.push(data);
else if (!queue1.empty())//否则插入到不为空的队列中
queue1.push(data);
else
queue2.push(data);
}
void PopBak()
{
if (!queue1.empty())//删除时将不为空的队列中元素移到空队列中,并将最后一个元素删除
{
while (queue1.size() > 1)
{
T &data = queue1.front();
queue2.push(data);
queue1.pop();
}
queue1.pop();
}
else if (!queue2.empty())
{
while (queue2.size() > 1)
{
T &data = queue2.front();
queue1.push(data);
queue2.pop();
}
queue2.pop();
}
}
private:
queue<T> queue1;
queue<T> queue2;
};