首页 > 其他分享 >7、队列

7、队列

时间:2024-09-16 15:45:57浏览次数:1  
标签:队列 SeqQueue queue int front void rear

1、链队

#include<stdio.h>
#include<malloc.h>
#include<assert.h>

#define ElemType int

typedef struct QueueNode{
    ElemType data;
    struct QueueNode* next;
}QueueNode; 

typedef struct LinkQueue{
    QueueNode* front;//队头
    QueueNode* tail;//队尾 
}LinkQueue;

QueueNode* malloc_QueueNode(ElemType e){
    QueueNode* node = (QueueNode*)malloc(sizeof(QueueNode));
    assert(node != NULL);
    node->data = e;
    node->next = NULL;
}

void initQueue(LinkQueue* queue){
    //构造虚拟头结点
    QueueNode* p = malloc_QueueNode(-1);
    queue->front = queue->tail = p;
}

//入队
void enQueue(LinkQueue* queue,ElemType e){
    QueueNode* p = malloc_QueueNode(e);
    queue->tail->next = p;
    
    //修改队尾 
    queue->tail = p; 
}

//出队
int deQueue(LinkQueue* queue){
    if(queue->front == queue->tail){
        printf("当前链队为空,不可删除.\n");
        return;
    }
    QueueNode* p = queue->front->next;
    queue->front->next = p->next;
    if(p == queue->tail){
        queue->tail = queue->front;
    }
    free(p);
}

//得到队头元素
void getHead(LinkQueue* queue,ElemType* e){
    if(queue->front == queue->tail){
        printf("当前链队为空.\n");
        return;
    }
    QueueNode* p = queue->front->next;
    *e = p->data;
}

//长度
int length(LinkQueue* queue){
    int len = 0;
    QueueNode* p = queue->front->next;
    while(p != NULL){
        p = p->next;
        len++;
    }
    return len;
}

//清空链队
void clear(LinkQueue* queue){
    QueueNode* p = queue->front->next;
    while(p != NULL){
        queue->front->next = p->next;
        free(p);
        p = queue->front->next;
    }
    queue->tail = queue->front;
}

//销毁
void destroy(LinkQueue* queue){
    clear(queue);
    free(queue->front);
    queue->front = queue->tail = NULL;
}
//打印链队
void showQueue(LinkQueue* queue){
    QueueNode* p = queue->front->next;
    while(p != NULL){
        printf("%d->",p->data);
        p = p->next;
    }
    printf("NULL.\n");
}
int main(){
    LinkQueue queue;
    initQueue(&queue);
    int i = 1;
    for(i;i <= 5;i++){
        enQueue(&queue,i); 
    }
    showQueue(&queue);
    deQueue(&queue);
    showQueue(&queue);

    return 0;
}

2、顺序队

#include<stdio.h>
#include<malloc.h>
#include<assert.h>

#define ElemType int

#define MAXSIZE 8
//顺序队列 
typedef struct SeqQueue{
    ElemType* base;
    int front;//队头 
    int rear;//队尾 
}SeqQueue;

//初始化顺序队列 
void initSeqQueue(SeqQueue* Q){
    Q->base = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);
    assert(Q->base != NULL);
    Q->front = 0;
    Q->rear = 0;
}

//入队
void enQueue(SeqQueue* Q,ElemType e){
    if(Q->rear >= MAXSIZE){
        printf("队列空间已满,%d 不可入队.\n",e);
        return;
    }
    Q->base[Q->rear++] = e;
} 

//出队
void DeQueue(SeqQueue* Q){
    if(Q->front == Q->rear){
        printf("队列为空,不可出队.\n");
        return;
    }
    Q->front++;
}
//打印队列
void showSeqQueue(SeqQueue* Q){
    int i = Q->front;
    for(i;i < Q->rear;i++){
        printf("%d ",Q->base[i]);
    }
    printf("\n");
} 

void getHead(SeqQueue* Q,ElemType* e){
    if(Q->front == Q->rear){
        printf("队列为空,无法获取队头元素.\n");
        return;
    }
    *e = Q->base[Q->front];
}

int length(SeqQueue* Q){
    return Q->rear - Q->front;
}

void clear(SeqQueue* Q){
    Q->front = Q->rear = 0;
}

void destroy(SeqQueue* Q){
    free(Q->base);
    Q->base = NULL;
}
int main(){
    SeqQueue Q;
    initSeqQueue(&Q);
    
    int i = 1;
    for(i;i <= 10;i++){
        enQueue(&Q,i);
    }
    showSeqQueue(&Q);
    DeQueue(&Q);
    showSeqQueue(&Q);

    return 0;
} 

3、循环队列

 

#include<stdio.h>
#include<malloc.h>
#include<assert.h>

#define ElemType int

#define MAXSIZE 8
//顺序队列 
typedef struct SeqQueue{
    ElemType* base;
    int front;//队头 
    int rear;//队尾 
}SeqQueue;

//初始化顺序队列 
void initSeqQueue(SeqQueue* Q){
    Q->base = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);
    assert(Q->base != NULL);
    Q->front = 0;
    Q->rear = 0;
}

//入队
void enQueue(SeqQueue* Q,ElemType e){
    if(((Q->rear + 1) % MAXSIZE) == Q->front){
        printf("队列空间已满,%d 不可入队.\n",e);
        return;
    }
    Q->base[Q->rear] = e;
    Q->rear = (Q->rear + 1) % MAXSIZE;
} 

//出队
void DeQueue(SeqQueue* Q){
    if(Q->front == Q->rear){
        printf("队列为空,不可出队.\n");
        return;
    }
    Q->front = (Q->front + 1) % MAXSIZE;
}
//打印队列
void showSeqQueue(SeqQueue* Q){
    int i = Q->front;
    for(i;i != Q->rear;i = (i + 1) % MAXSIZE){
        printf("%d ",Q->base[i]);
    }
    printf("\n");
} 

void getHead(SeqQueue* Q,ElemType* e){
    if(Q->front == Q->rear){
        printf("队列为空,无法获取队头元素.\n");
        return;
    }
    *e = Q->base[Q->front];
}

int length(SeqQueue* Q){
    return Q->rear - Q->front;
}

void clear(SeqQueue* Q){
    Q->front = Q->rear = 0;
}

void destroy(SeqQueue* Q){
    free(Q->base);
    Q->base = NULL;
}
int main(){
    SeqQueue Q;
    initSeqQueue(&Q);
    
    int i = 1;
    for(i;i <= 10;i++){
        enQueue(&Q,i);
    }
    showSeqQueue(&Q);
    DeQueue(&Q);
    showSeqQueue(&Q);

    return 0;
} 

注:上诉使用空一个空间来方便判断空和判满,如果不想浪费这一个空间,可通过设置一个标志位来用于判空和判满。

 

标签:队列,SeqQueue,queue,int,front,void,rear
From: https://www.cnblogs.com/xpp3/p/18416332

相关文章

  • 图:207课程表 题解:入度数组,邻接表,队列,拓扑排序
    207.课程表-力扣(LeetCode)没做出来,参考题解,这篇题解写的非常好。把一个有向无环图转成线性的排序就叫 拓扑排序。(没太懂这句话的意思)classSolution{public:boolcanFinish(intnumCourses,vector<vector<int>>&prerequisites){vector<int>inDegre......
  • c语言写的环形队列
            以下是一个简单的环形队列的实现示例,包括初始化、入队、出队、查询当前元素个数、队列长度和队列元素可视化。        这里使用了静态数组来实现队列的存储,适合于固定大小的队列。#include<stdio.h>#defineMAX_QUEUE_SIZE10 //定义队列的最大......
  • 栈-队列
    AcWing828.模拟栈模板题:实现一个栈,栈初始为空,支持四种操作:pushx–向栈顶插入一个数x;pop–从栈顶弹出一个数;empty–判断栈是否为空;query–查询栈顶元素。现在要对栈进行MM个操作,其中的每个操作3和操作4都要输出相应的结果。输入格式第一行包含整数M,......
  • 信息学奥赛初赛天天练-89-CSP-S2023基础题1-linux常用命令、完全平方数、稀疏图、队列
    PDF文档公众号回复关键字:202409142023CSP-S选择题单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项)1在Linux系统终端中,以下哪个命令用于创建一个新的目录?()AnewdirBmkdirCcreateDmkfold2从0,1,2,3,4中选取4个数字,能组成(......
  • 【数据结构】队列
    队列的概念及结构队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(FirstInFirstOut)入队列:进行插入操作的一端称为队尾出队列:进行删除操作的一端称为队头队列的模拟实现队列也可以数组和链表的结构实现,使用链表的结构......
  • 队列的定义和基本操作的实现
    写代码:定义顺序存储的队列(数组实现),要求数组空间可以被循环利用 写代码:基于上述定义,实现“出队、入队、判空、判满”四个基本操作 写代码:定义链式存储的队列(单链表实现) 写代码:基于上述定义,实现“出队、入队、判空、判满”四个基本操作 1.定义顺序存储的队列(数组实现),要......
  • 滑动窗口+单调队列
    题目:2398.预算内的最多机器人数目答案:#fromtypingimportList#fromcollectionsimportdequeclassSolution:defmaximumRobots(self,chargeTimes:List[int],runningCosts:List[int],budget:int)->int:res,n,runningCostSum=0,len(chargeTi......
  • (nice!!!)LeetCode 2398. 预算内的最多机器人数目(队列、滑动窗口)
    题目:2398.预算内的最多机器人数目思路:双端队列+滑动窗口。因为需要找连续的机器人,这里就需要用到滑动窗口。细节看注释,时间复杂度0(n)。classSolution{public:intmaximumRobots(vector<int>&chargeTimes,vector<int>&runningCosts,longlongbudget){......
  • 【每日一题】LeetCode 2398.预算内的最多机器人数目(滑动窗口、数组、二分查找、前缀和
    【每日一题】LeetCode2398.预算内的最多机器人数目(滑动窗口、数组、二分查找、前缀和、堆(优先队列))题目描述给定两个整数数组chargeTimes和runningCosts,分别代表n个机器人的充电时间和运行成本。再给定一个整数budget,表示预算。我们需要计算在不超过预算的情况下,最......
  • Team Queue(队列)
    #include<bits/stdc++.h>usingnamespacestd;#definexfirst#defineysecondtypedefpair<int,int>PII;typedeflonglongll;typedefunsignedlonglongull;typedefunsignedintuint;typedefvector<string>VS;typedefvector<int>......