找人做效果图去什么网站家政服务公司网站建设方案策划书
找人做效果图去什么网站,家政服务公司网站建设方案策划书,莞城做网站公司,成立一个公司需要什么条件队列(queue)是一种遵循先入先出规则的线性数据结构。顾名思义#xff0c;队列模拟了排队现象#xff0c;即新来的人不断加入队列的尾部#xff0c;而位于队列头部的人逐个离开。
如下图所示#xff0c;我们将队列的头部称为“队首”#xff0c;尾部称为“队尾”#xff…队列(queue)是一种遵循先入先出规则的线性数据结构。顾名思义队列模拟了排队现象即新来的人不断加入队列的尾部而位于队列头部的人逐个离开。
如下图所示我们将队列的头部称为“队首”尾部称为“队尾”将把元素加入队尾的操作称为“入队”删除队首元素的操作称为“出队”。 8.1 队列常用操作
队列的常见操作如下表所示。需要注意的是不同编程语言的方法名称可能会有所不同。我们在此采用与栈相同的方法命名。 我们可以直接使用编程语言中现成的队列类。
/* 初始化队列 */
queueint queue;/* 元素入队 */
queue.push(1);
queue.push(3);
queue.push(2);
queue.push(5);
queue.push(4);/* 访问队首元素 */
int front queue.front();/* 元素出队 */
queue.pop();/* 获取队列的长度 */
int size queue.size();/* 判断队列是否为空 */
bool empty queue.empty();8.2 队列实现
为了实现队列我们需要一种数据结构可以在一端添加元素并在另一端删除元素。因此链表和数组都可以用来实现队列。
1. 基于链表的实现
如图下图所示我们可以将链表的“头节点”和“尾节点”分别视为“队首”和“队尾”规定队尾仅可添加节点队首仅可删除节点。 以下是用链表实现队列的代码。
/* 基于链表实现的队列 */
class LinkedListQueue {private:ListNode *front, *rear; // 头节点 front 尾节点 rearint queSize;public:LinkedListQueue() {front nullptr;rear nullptr;queSize 0;}~LinkedListQueue() {// 遍历链表删除节点释放内存freeMemoryLinkedList(front);}/* 获取队列的长度 */int size() {return queSize;}/* 判断队列是否为空 */bool isEmpty() {return queSize 0;}/* 入队 */void push(int num) {// 尾节点后添加 numListNode *node new ListNode(num);// 如果队列为空则令头、尾节点都指向该节点if (front nullptr) {front node;rear node;}// 如果队列不为空则将该节点添加到尾节点后else {rear-next node;rear node;}queSize;}/* 出队 */void pop() {int num peek();// 删除头节点ListNode *tmp front;front front-next;// 释放内存delete tmp;queSize--;}/* 访问队首元素 */int peek() {if (size() 0)throw out_of_range(队列为空);return front-val;}/* 将链表转化为 Vector 并返回 */vectorint toVector() {ListNode *node front;vectorint res(size());for (int i 0; i res.size(); i) {res[i] node-val;node node-next;}return res;}
};2. 基于数组的实现
由于数组删除首元素的时间复杂度为O(n)这会导致出队操作效率较低。然而我们可以采用以下巧妙方法来避免这个问题。
我们可以使用一个变量 front 指向队首元素的索引并维护一个变量 size 用于记录队列长度。定义 rear front size 这个公式计算出的 rear 指向队尾元素之后的下一个位置。
基于此设计数组中包含元素的有效区间为 [front, rear - 1]各种操作的实现方法如图 5-6 所示。
入队操作将输入元素赋值给 rear 索引处并将 size 增加 1 。出队操作只需将 front 增加 1 并将 size 减少 1 。
可以看到入队和出队操作都只需进行一次操作时间复杂度均为 O(1) 。 你可能会发现一个问题在不断进行入队和出队的过程中front 和 rear 都在向右移动当它们到达数组尾部时就无法继续移动了。为解决此问题我们可以将数组视为首尾相接的“环形数组”。
对于环形数组我们需要让 front 或 rear 在越过数组尾部时直接回到数组头部继续遍历。这种周期性规律可以通过“取余操作”来实现代码如下所示。
/* 基于环形数组实现的队列 */
class ArrayQueue {private:int *nums; // 用于存储队列元素的数组int front; // 队首指针指向队首元素int queSize; // 队列长度int queCapacity; // 队列容量public:ArrayQueue(int capacity) {// 初始化数组nums new int[capacity];queCapacity capacity;front queSize 0;}~ArrayQueue() {delete[] nums;}/* 获取队列的容量 */int capacity() {return queCapacity;}/* 获取队列的长度 */int size() {return queSize;}/* 判断队列是否为空 */bool isEmpty() {return size() 0;}/* 入队 */void push(int num) {if (queSize queCapacity) {cout 队列已满 endl;return;}// 计算队尾指针指向队尾索引 1// 通过取余操作实现 rear 越过数组尾部后回到头部int rear (front queSize) % queCapacity;// 将 num 添加至队尾nums[rear] num;queSize;}/* 出队 */void pop() {int num peek();// 队首指针向后移动一位若越过尾部则返回到数组头部front (front 1) % queCapacity;queSize--;}/* 访问队首元素 */int peek() {if (isEmpty())throw out_of_range(队列为空);return nums[front];}/* 将数组转化为 Vector 并返回 */vectorint toVector() {// 仅转换有效长度范围内的列表元素vectorint arr(queSize);for (int i 0, j front; i queSize; i, j) {arr[i] nums[j % queCapacity];}return arr;}
};以上实现的队列仍然具有局限性即其长度不可变。然而这个问题不难解决我们可以将数组替换为动态数组从而引入扩容机制。有兴趣的同学可以尝试自行实现。
两种实现的对比结论与栈一致在此不再赘述。
8.3 队列典型应用
淘宝订单。购物者下单后订单将加入队列中系统随后会根据顺序依次处理队列中的订单。在双十一期间短时间内会产生海量订单高并发成为工程师们需要重点攻克的问题。各类待办事项。任何需要实现“先来后到”功能的场景例如打印机的任务队列、餐厅的出餐队列等。队列在这些场景中可以有效地维护处理顺序。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/90383.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!