题目(leecode T232):
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push
、pop
、peek
、empty
):
实现 MyQueue
类:
void push(int x)
将元素 x 推到队列的末尾int pop()
从队列的开头移除并返回元素int peek()
返回队列开头的元素boolean empty()
如果队列为空,返回true
;否则,返回false
说明:
- 你 只能 使用标准的栈操作 —— 也就是只有
push to top
,peek/pop from top
,size
, 和is empty
操作是合法的。 - 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
方法:用栈模拟队列需要两个栈才能完成,一个作为输入栈,一个作为输出栈。
push的函数很容易实现,直接将输入数据x输入进输入栈即可。
输出函数pop稍微麻烦一点。我们需要判断输出栈是否为空,如果为空的话,就证明输出栈现在没有元素,我们需要将输入栈中的元素全部按顺序转移至输出栈,这样的话从输出栈中出栈的元素就和队列去除元素的顺序是一致的;如果输出栈中不是空的,那么我们直接从输出栈中取元素即可。
peek函数也很容易实现,这个函数只是获得队首元素的数值但是并不去取出来,这与pop函数唯一的区别就是取不取出元素的区别,我们可以直接调用pop函数,只不过最后再把pop取出的元素数值再放进去即可。
判空函数empty也很容易实现,直接判断输入栈和输出栈中现在是否还有元素即可,有的话就不为空;反之。
题解:
class MyQueue {
public:
stack<int> stIn; //输入栈
stack<int> stOut; //输出栈
MyQueue() {
}
void push(int x) {
stIn.push(x);
}
int pop() {
if(stOut.empty()){ //判断输出栈是否为空
while(!stIn.empty()){
stOut.push(stIn.top()); //为空的话需要把输入栈的值按序输入输出栈
stIn.pop();
}
}
int result = stOut.top(); //不为空直接输出
stOut.pop();
return result;
}
int peek() {
int res = this->pop();
stOut.push(res); //将取出的元素再放回去
return res;
}
bool empty() {
return stIn.empty()&&stOut.empty();
}
};