题目内容
使用栈实现队列的下列操作:
push(x) -- 将一个元素放入队列的尾部。
pop() -- 从队列首部移除元素。
peek() -- 返回队列首部的元素。
empty() -- 返回队列是否为空
示例
MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false
题目分析
这种题可以采用双栈的方式完成。分别命名为inStack,用于存储该队列的元素(顺序栈),outStack用于还原元素在队列中的位置(逆序栈)。
所以对于队列中各函数的实现:
void cheak():首先判断outStack是否为空,若不为空直接弹出该栈栈顶元素,若为空,先把inStack所有元素逐一弹出,push到outStack,最后弹出outStack的栈顶元素,这样即可实现逆向存储
void push(x)(入队):直接将队列元素存入inStack中。若存入队列的元素为1,2,3,所以在inStack中的元素为3,2,1(3在最前面),outStack为空。
int pop()(删除首部元素并返回该值):首先进行cheak()操作,得到outStack中的元素为1,2,3(1在最前面),inStack由于pop后目前为空。随后将outStack的首元素取出来作为队列中的首元素,并将其删除。此时返回1,outStack中的元素为2,3。
int peak()(返回队列首部元素):同样先进行cheak()操作,随后直接返回outStack首部元素即可。
bool empty()(判空):此时需要判断inStack和outStack均为空才可以。原理很简单,一个队列的元素若判断它里面为空,则正向排列为空逆向排列也为空即可。
代码实现
class MyQueue
{
public:
stack<int> inStack;
stack<int> outStack;
MyQueue()
{
}
void push(int x)
{
inStack.push(x);
}
int pop()
{
cheak();
int a = outStack.top();
outStack.pop();
return a;
}
int peek()
{
cheak();
return outStack.top();
}
bool empty()
{
return inStack.empty() && outStack.empty();
}
void cheak()
{
if (outStack.empty())
{
while (!inStack.empty())
{
outStack.push(inStack.top());
inStack.pop();
}
}
}
};