第五章 栈与队列 Part 1"/>
【代码随想录】算法训练营 第十天 第五章 栈与队列 Part 1
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;elsereturn 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();*/
更多推荐
【代码随想录】算法训练营 第十天 第五章 栈与队列 Part 1
发布评论