当前位置: 首页 > news >正文

[LeetBook]【学习日记】图书整理 II——用两个栈实现队列

题目

图书整理 II
读者来到图书馆排队借还书,图书管理员使用两个书车来完成整理借还书的任务。书车中的书从下往上叠加存放,图书管理员每次只能拿取书车顶部的书。排队的读者会有两种操作:

  • push(bookID):把借阅的书籍还到图书馆。
  • pop():从图书馆中借出书籍。

为了保持图书的顺序,图书管理员每次取出供读者借阅的书籍是最早归还到图书馆的书籍。你需要返回每次读者借出书的值。

如果没有归还的书可以取出,返回 -1。

示例 1:

输入: [“BookQueue”, “push”, “push”, “pop”] [[], [1], [2], []]
输出:[null,null,null,1] 解释: MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1] myQueue.push(2); // queue is: [1, 2]
(leftmost is front of the queue) myQueue.pop(); // return 1, queue is
[2]

提示:

1 <= bookID <= 10000 最多会对 push、pop 进行 10000 次调用

思考

  • 本题其实就是要求实现队列以及队列的入队函数和出队函数
  • 按题目的要求,实际上是要求使用两个栈(两个书车)来实现队列
  • 但是解法1 没用用栈

解法1:使用 vector 实现

class CQueue {vector<int> vec;int head=0;
public:CQueue() {}void appendTail(int value) {vec.push_back(value);}int deleteHead() {if(head<vec.size()){return vec[head++];}return -1;}
};/*** Your CQueue object will be instantiated and called as such:* CQueue* obj = new CQueue();* obj->appendTail(value);* int param_2 = obj->deleteHead();*/

解法2:使用 stack 实现

  • 本质上是用另一个栈实现对另一个栈中元素的倒序
  • 在倒序栈中,如果还有元素,在出队的时候直接 pop 即可,因为此时倒序栈中的元素还是较早入队的元素
  • 直到倒序栈中没有元素,再将顺序栈中的元素放入倒序栈
class CQueue {stack<int> a, b;
public:CQueue() {}void appendTail(int value) {a.push(value);}int deleteHead() {if(a.empty() && b.empty()) return -1;if(b.empty() && !a.empty()){while(!a.empty()){b.push(a.top());a.pop();} }int temp = b.top();b.pop();return temp;}
};/*** Your CQueue object will be instantiated and called as such:* CQueue* obj = new CQueue();* obj->appendTail(value);* int param_2 = obj->deleteHead();*/
http://www.lryc.cn/news/312724.html

相关文章:

  • 5G智能制造食品工厂数字孪生可视化平台,推进食品行业数字化转型
  • 一个系列很多样式的wordpress外贸建站模板
  • Wireshark_labs TCP
  • Linux程序崩溃调试
  • Day37 socket、TCP、UDP
  • 从 Language Model 到 Chat Application:对话接口的设计与实现
  • 无人机|LQR控制算法及其无人机控制中的应用仿真
  • ubuntu环境下docker容器详细安装使用
  • vue2源码分析-vue入口文件global-api分析
  • Javascript原型 ,原型链如何理解使用 ?有什么特点?
  • Flutter混合栈管理方案对比
  • Asp .Net Core 集成 Newtonsoft.Json
  • GPT对话知识库——ARM-Cortex架构分为哪几个系列?每个系列有几种工作模式?各种工作模式之间的定义和区别?每种架构不同的特点和应用需求?
  • 795. 前缀和(acwing)
  • 1910_野火FreeRTOS教程阅读笔记_prvStartFirstTask函数
  • 图论练习5
  • [C++] Volatile 和常量Const优化
  • 嵌入式学习day32 网络
  • 算法D33 | 贪心算法3 | 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果
  • html地铁跑酷
  • 利用GPT开发应用001:GPT基础知识及LLM发展
  • Golang Ants 构建协程池
  • 【金三银四】面试题汇总(持续编写中)
  • Hive的数据存储
  • ORACLE 如何使用dblink实现跨库访问
  • Sentinel 面试题及答案整理,最新面试题
  • Qt在windows编译hiredis依赖库
  • 【工作向】protobuf编译生成pb.cc和pb.py文件
  • android 快速实现 垂直SeekBar(VerticalSeekBar)
  • 算法刷题day23:双指针