【代码随想录】算法训练营 第十天 第五章 栈与队列 Part 1

编程入门 行业动态 更新时间:2024-10-27 04:25:07

【代码随想录】算法训练营 第十天 <a href=https://www.elefans.com/category/jswz/34/1668470.html style=第五章 栈与队列 Part 1"/>

【代码随想录】算法训练营 第十天 第五章 栈与队列 Part 1

232. 用栈实现队列

题目

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

说明:

  • 你 只能 使用标准的栈操作 —— 也就是只有 push to toppeek/pop from topsize, 和 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)的栈,并支持普通栈的全部四种操作(pushtoppop 和 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

本文发布于:2023-12-06 11:17:22,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1667439.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:第五章   队列   算法   训练营   代码

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!