232. 用栈实现队列
题目
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(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(双端队列)来模拟一个栈,只要是标准的栈操作即可。
思路
用两个栈来模拟队列,一个模拟队列的入口,另一个模拟队列的出口,要注意的是,在实现涉及到某个口的操作时,需要保证所有元素都在模拟那个口的栈中;
其次就是要熟悉栈stack这个容器的操作。
代码
class MyQueue {
public:
stack<int> stin; // 模拟队列的输入口
stack<int> stout; // 模拟队列的输出口
MyQueue() { // 由于我们是用栈来模拟的,所以这里不需要写内容
}
void push(int x) { // 由于我们的队列不限长度,所以要添加元素时就直接push到模拟输入口的栈里即可
stin.push(x);
}
int pop() { // 模拟弹出队头元素
if(stout.empty()) { // 弹出元素涉及到队列的出口,所以要判断模拟队列出口的栈是否为空
while (!stin.empty()) { // 模拟队列出口的栈不为空,就要把入口栈的元素全部移到出口栈,这样才能弹出处于入口栈底的元素
stout.push(stin.top()); // 将入口栈的栈顶元素取出,放入出口栈
stin.pop(); // 注意上面的取出只是把值取出,元素还在里面,所以要pop掉
}
}
int result = stout.top();
stout.pop();
return result;
}
int peek() {
if (stout.empty()) {
while (!stin.empty()) {
stout.push(stin.top());
stin.pop();
}
}
return stout.top();
}
bool empty() {
if (stin.empty() && stout.empty())
return true;
else
return false;
}
};
/**
* 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();
*/
225. 用队列实现栈
题目
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push
、top
、pop
和 empty
)。
实现 MyStack
类:
void push(int x)
将元素 x 压入栈顶。int pop()
移除并返回栈顶元素。int top()
返回栈顶元素。boolean empty()
如果栈是空的,返回true
;否则,返回false
。
思路
可以用两个队列实现,其实用一个队列也行。
用两个队列的话,一个是用来模拟栈的,另一个则是作为辅助队列,只能在操作中暂存元素,操作完后还得把元素还给第一个栈然后再清空。
代码
两个队列实现
class MyStack {
public:
queue<int> q1;
queue<int> q2;
MyStack() {
}
void push(int x) {
q1.push(x);
}
int pop() {
int size = q1.size();
size--;
while (size--) {
q2.push(q1.front());
q1.pop();
}
int result = q1.front();
q1.pop();
q1 = q2;
while (!q2.empty()) {
q2.pop();
}
return result;
}
int top() {
return q1.back;
}
bool empty() {
return q1.empty();
}
};
/**
* 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();
*/
一个队列实现
class MyStack {
public:
queue<int> q;
MyStack() {
}
void push(int x) {
q.push(x);
}
int pop() {
int size = q.size();
size--;
while (size--) {
q.push(q.front());
q.pop();
}
int result = q.front();
q.pop();
return result;
}
int top() {
return q.back();
}
bool empty() {
return q.empty();
}
};
/**
* 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();
*/