首页 > 其他分享 >队列(Queue)

队列(Queue)

时间:2023-08-01 10:12:59浏览次数:26  
标签:Node temp 队列 nullptr Queue int IsEmpty

用途

1.访问资源的时候(比如几个电脑让同一个打印机进行打印)请求会被存在一个队列中,cpu处理进程也是一样的。

实现

1.循环数组方式实现

class array_queue{
    int front=-1,rear=-1;//队列的头指针和尾指针
    int size;
    int*array= nullptr;
public:
    array_queue(int s):size(s){
        array=new int[size];//申请空间
    }
    bool IsEmpty(){//判断队列是否为空
        return front==-1&&rear==-1;
    }
    bool IsFull(){//判断队列是否满了
        return (rear+1)%size==front;//循环数组判断队列满的情况
    }
    void Enqueue(int x){//插入
        if(IsEmpty()){
            front=rear=0;
        } else if(IsFull()){
            cout<<"the queue is full"<<endl;
            return;
        } else{
            rear=(rear+1)%size;//循环数组
        }
        array[rear]=x;
    }
    void Dequeue(){//删除最先进入队列的结点
        if(IsEmpty())return;
        else if(front==rear)front=rear=-1;
        else front=(front+1)%size;//循环数组
    }
    int Front(){//返回头结点的数据
        if(IsEmpty()){
            cout<<"the queue is empty"<<endl;
            exit(1);
        }
        return array[front];
    }
};

2.链表方式实现

struct Node{
    int data;
    Node*next;
};//链表节点
class list_queue{
    Node*head= nullptr;
    Node*tail= nullptr;
public:
    bool IsEmpty(){
        return head== nullptr&&tail== nullptr;//二者都为空的时候队列为空
    }
    void Enqueue(int x){
        Node*temp=new Node;
        temp->data=x;
        temp->next= nullptr;
        if(IsEmpty()){
            head=tail=temp;
        }else{
            tail->next=temp;
            tail=temp;
        }
    }
    void Dequeue(){
        if(IsEmpty()){
            cout<<"the queue is empty";
            return;
        }
        if(head==tail){
            head=tail= nullptr;//二者相等相当于队列仅剩余一个节点,删除后把队列置零即可
            return;
        }
        Node*temp=head;
        head=head->next;
        delete temp;
    }
    void Print(){
        if(IsEmpty())return;
        Node*temp=head;
        while(temp!= nullptr){
            cout<<temp->data<<" ";
            temp=temp->next;
        }
        cout<<endl;
    }
};

标签:Node,temp,队列,nullptr,Queue,int,IsEmpty
From: https://www.cnblogs.com/wylove/p/17595680.html

相关文章

  • 剑指 Offer 59 - II. 队列的最大值(中等)
    题目:classMaxQueue{public:deque<int>que1;//使用两个双端栈(deque和queue不一样,用deque就行)deque<int>que2;MaxQueue(){}intmax_value(){returnque2.empty()?-1:que2.front();}voidpush_back(intv......
  • redis做消息队列学习
    转自:https://juejin.cn/post/7094272373930590245#heading-9,https://zhuanlan.zhihu.com/p/3442697371、消息队列基本作用:应用解耦(作为中介)、削峰填谷。redis做mq的优点:轻量级,使用和运维成本低。mq的3个基本要求:消息保序sequence:对应消息需要有序消费的场景;处理重复消息dupl......
  • BZOJ 4321 queue2 题解
    在硬盘里翻到了当时没推完的这个题,今天补完了最后几步。题目链接:https://hydro.ac/d/bzoj/p/4321对任意相邻两个元素差的绝对值不为\(1\)的\(n\)阶排列计数。\(\mathcal{O}(n^2)\)做法是考虑按照值域由小到大逐步插入,记录\(f_{i,j}\)为长度为\(i\)的排列,一共有\(j\)......
  • .netcore 中高性能队列Channel的应用与封装
          Channel存在于命名空间System.Threading.Channels中,是.net一种新型的线程安全集合,提供了发布和订阅消息处理功能,在一个服务中若接收消息和处理消息都很频繁,且处理消息耗时较长时,Channel是一种好的处理方式。1、创建Channel方式(支持泛型消息格式) 支持5种创建......
  • 栈与循环队列
    1.栈(Stack)是一种具有后进先出(LIFO)特性的线性数据结构。在栈中,元素的插入和删除操作只能在栈的一端进行,通常称为栈顶。栈不支持在任意位置的元素访问,只能访问栈顶的元素。栈的常见操作包括入栈(push)将元素放入栈顶、出栈(pop)将栈顶元素移除,以及获取栈顶元素(peek)等。下面是一个使用Pyth......
  • LeetCode 239. Sliding Window Maximum 单调队列
    Youaregivenanarrayofintegersnums,thereisaslidingwindowofsizekwhichismovingfromtheveryleftofthearraytotheveryright.Youcanonlyseetheknumbersinthewindow.Eachtimetheslidingwindowmovesrightbyoneposition.Return......
  • 链表/栈/队列/KMP
    链表用数组模拟,不同于结构体加指针调用new关键字开上万级别的节点非常慢,基本会超时单链表来构造邻接表用于存图与树基本结构:head表示头结点的下标e[i]表示节点i的值ne[i]表示节点i的下一个节点的下标idx存储当前已经用到了哪个节点,表示新节点基本操作:......
  • 数据结构中队列的存储和应用
    队列:只有两个口进出数据,一个专门进入数据,另一个专门出数据,先进先出,FIFO表 一、顺序队列:存储元素的连续内存的首地址容量队头位置(出队)队尾位置(入队)[元素数量]运算:创建、销毁、清空、出队、入队、队空、队满、队头、队尾、元素数量#inclu......
  • std::queue 中遇到释放内存错误的问题
    项目上有个需求要用到std::queue顺序处理消息事件简单的示例如下:structMyEvent{MyEvent(){event_=CreateEvent(nullptr,0,0,0);}~MyEvent(){std::cout<<"MyEventdeconstruct"<<std::endl;}voidRun(){if(event_!=nullptr){S......
  • 剑指 Offer 09. 用两个栈实现队列(简单)
    题目:classCQueue{public:stack<int>st1;stack<int>st2;CQueue(){}voidappendTail(intvalue){st1.push(value);}intdeleteHead(){if(st1.empty()&&st2.empty())return-1;......