提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
题目链接
用栈实现队列
用队列实现栈
一、用栈实现队列
解题思路
我们先复习一下栈和队列的基本知识
栈:
栈是一种先进后出的数据结构,它仅允许从一端进行插入和和删除操作
队列
队列是一种先进先出的数据结构,它允许从队列的一端插入从另一端删除
那么对于这道题来说,用两个栈实现队列我们先考虑入栈的情况,当1, 2入栈后,此时如果要执行出队操作,即我们要取到元素1,那么我们就必须要将战中所有元素弹出,才能拿到1,但这之后就无法进行其余操作,所以我们在执行出队操作的时候,需要另一个栈来保存元素,即我们需要在出队时,将当前栈中所有元素拷贝至另一个栈
示意图
代码实现
class MyQueue {
public:
/** Initialize your data structure here. */
MyQueue() {
}
/** Push element x to the back of queue. */
void push(int x) {
instack.push(x);
}
void transfer()
{
if(outstack.empty())
{
while(!instack.empty())
{
outstack.push(instack.top());
instack.pop();
}
}
}
/** Removes the element from in front of queue and returns that element. */
int pop() {
transfer();
int x = outstack.top();
outstack.pop();
return x;
}
/** Get the front element. */
int peek() {
transfer();
return outstack.top();
}
/** Returns whether the queue is empty. */
bool empty() {
return instack.empty() && outstack.empty();
}
private:
stack<int> instack;
stack<int> outstack;
};
/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue* obj = new MyQueue();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->peek();
* bool param_4 = obj->empty();
*/
二、用队列实现栈
解题思路
我们同样来考虑队列的操作 元素1,2入队,此时如果出栈的话,我们需要拿到元素2,因此需要辅助栈将size-1个元素在该队出队,同时将这些元素放入另一个队。在执行完出栈操作后,在将这些元素入队
再进一步想,我们的辅助队列仅仅是充当了一个暂时放置元素的作用,因此我们可以考虑将这些元素出队时并不是放入辅助队,而是放入当前队列的尾部,这样也不会影响队列中元素顺序
示意图
代码实现
class MyStack {
public:
/** Initialize your data structure here. */
MyStack() {
}
/** Push element x onto stack. */
void push(int x) {
q.push(x);
}
/** Removes the element on top of the stack and returns that element. */
int pop() {
if(!q.empty())
{
int size = q.size();
while(--size)
{
q.push(q.front());
q.pop();
}
}
int ret = q.front();
q.pop();
return ret;
}
/** Get the top element. */
int top() {
return q.back();
}
/** Returns whether the stack is empty. */
bool empty() {
return q.empty();
}
queue<int> q;
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/