代码随想录算法训练营day10 | P232.用栈实现队列、P225. 用队列实现栈
P232.用栈实现队列
题目链接:P232.用栈实现队列
代码随想录讲解
题目描述:
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(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(双端队列)来模拟一个栈,只要是标准的栈操作即可。
示例 1:
输入:
[“MyQueue”, “push”, “push”, “peek”, “pop”, “empty”]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 1, 1, false]
解释:
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false
提示:
1 <= x <= 9
- 最多调用
100
次push
、pop
、peek
和empty
- 假设所有操作都是有效的 (例如,一个空的队列不会调用
pop
或者peek
操作)
思路:
因为队列是先进先出的顺序,而栈则是先进后出的序列,所以要实现下面功能
void push(int x)
将元素 x 推到队列的末尾
要将元素推到队列末尾,只需要用stint栈接受即可,那么在从stint栈到stout栈的过程中,会将x变为第一个进入stout栈的元素,那么在stout栈中,x必然是最后一个出来的,所以可以实现int pop()
从队列的开头移除并返回元素
要从队列的开头返回并移除元素,首先要将输入进stint栈的元素转入stout栈中,然后通过stout栈返回。int peek()
返回队列开头的元素
只需要返回stout栈的top就好boolean empty()
如果队列为空,返回true
;否则,返回false
当stint栈与stout栈均为空的时候,该队列就为空。
代码:
class MyQueue {
public:
stack<int> stint;
stack<int> stout;
MyQueue() {
}
void push(int x) {
stint.push(x);
}
int pop() {
if(stout.empty()){
while(!stint.empty()){
stout.push(stint.top());
stint.pop();
}
}
int result = stout.top();
stout.pop();
return result;
}
int peek() {
int result = this->pop();
stout.push(result);
return result;
}
bool empty() {
return stint.empty() && stout.empty();
}
};
/**
* 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();
*/
P225. 用队列实现栈
题目链接:P225. 用队列实现栈
代码随想录讲解
题目描述:
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push
、top
、pop
和 empty
)。
实现 MyStack
类:
void push(int x)
将元素 x 压入栈顶。int pop()
移除并返回栈顶元素。int top()
返回栈顶元素。boolean empty()
如果栈是空的,返回true
;否则,返回false
。
注意:
- 你只能使用队列的基本操作 —— 也就是
push to back
、peek/pop from front
、size
和is empty
这些操作。 - 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
示例:
输入:
[“MyStack”, “push”, “push”, “top”, “pop”, “empty”]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 2, 2, false]
解释:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False
提示:
1 <= x <= 9
- 最多调用
100
次push
、pop
、top
和empty
- 每次调用
pop
和top
都保证栈不为空
进阶:
你能否仅用一个队列来实现栈。
思路:
用一个队列的话如何将队列的最后一个元素第一个弹出呢?答案是先将前面的弹出,然后再存进队列当中,就可以实现了
代码:
class MyStack {
public:
queue<int> myqueue;
MyStack() {
}
void push(int x) {
myqueue.push(x);
}
int pop() {
int _size = myqueue.size() -1;
while(_size--){
int popindex = myqueue.front();
myqueue.pop();
myqueue.push(popindex);
}
int result = myqueue.front();
myqueue.pop();
return result;
}
int top() {
int _size = myqueue.size() -1;
while(_size--){
int popindex = myqueue.front();
myqueue.pop();
myqueue.push(popindex);
}
int result = myqueue.front();
myqueue.push(myqueue.front());
myqueue.pop();
return result;
}
bool empty() {
return myqueue.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();
*/