首页 > 其他分享 >【数据结构】队列

【数据结构】队列

时间:2023-02-16 15:12:23浏览次数:33  
标签:NULL return 队列 sq lq front 数据结构 sequeue

队列

队列是限制在两端进行数据插入或删除的线性表,其特点为“先入先出,后入后出”。

 允许进行入队的一端称为“队尾”,允许进行出兑的一端称为“队首”。

顺序队相关代码:

 sequeue.h

typedef int datatype;
#define N 128

typedef struct {
    datatype data[N];
    int front;
    int rear;
}sequeue;

sequeue * queue_create();          //创建顺序队列  返回值:队列结构体指针
int enqueue(sequeue *sq, datatype x);   //入队操作
datatype dequeue(sequeue *sq);       //出队操作  返回值:出队数据的值
int queue_empty(sequeue *sq);        //判断队列是否为空队
int queue_full(sequeue *sq);         //判断队列是否为满队
int queue_clear(sequeue *sq);        //清空队列数据
sequeue * queue_free(sequeue *sq);    //释放队列存储空间  返回值:NULL

sequeue.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sequeue.h"

sequeue * queue_create() {
    sequeue *sq;

    if ((sq = (sequeue *)malloc(sizeof(sequeue))) == NULL) {
        printf("malloc failed\n");
        return NULL;
    }

    memset(sq->data, 0, sizeof(sq->data));
    sq->front = sq->rear = 0;
    return sq;
}

int enqueue(sequeue *sq, datatype x) {
    if (sq == NULL) {
        printf("sq is NULL\n");
        return -1;
    }

    if ((sq->rear + 1) % N == sq->front) {
        printf("sequeue is full\n");
        return -1;
    }

    sq->data[sq->rear] = x;
    sq->rear = (sq->rear + 1) % N;

    return  0;
}

datatype dequeue(sequeue *sq) {
    datatype ret;

    ret = sq->data[sq->front];

    sq->front = (sq->front + 1) % N;

    return ret;
}

int queue_empty(sequeue *sq) {
    if (sq == NULL) {
        printf("sq is NULL\n");
        return -1;
    }

    return (sq->front == sq->rear ? 1 : 0);
}

int queue_full(sequeue *sq) {
    if (sq == NULL) {
        printf("sq is NULL\n");
        return -1;
    }

    if ((sq->rear + 1) % N == sq->front) {
        return 1;
    }
    else {
        return 0;
    }
}

int queue_clear(sequeue *sq) {
    if (sq == NULL) {
        printf("sq is NULL\n");
        return -1;
    }

    sq->front = sq->rear = 0;

    return 0;
}

sequeue * queue_free(sequeue *sq) {
    if (sq == NULL) {
        printf("sq is NULL\n");
        return NULL;
    }

    free(sq);
    sq = NULL;

    return NULL;
}

链式队列相关代码:

linkqueue.h

typedef int datatype;

typedef struct node {    //对队列结构体内成员做提前定义
    datatype data;
    struct node *next;
}listnode , *linklist;

typedef struct {      //队列数据结构
    linklist front;
    linklist rear;
}linkqueue;

linkqueue * queue_create();          //创建链式队列  返回值:队列数据结构指针
int enqueue(linkqueue *lq, datatype x);   //入队操作
datatype dequeue(linkqueue *lq);       //出队操作
int queue_empty(linkqueue *lq);            //判断队列是否为空
int queue_clear(linkqueue *lq);            //清除队列内容
linkqueue * queue_free(linkqueue *lq);     //释放队列所占内存

linkqueue.c

#include <stdio.h>
#include <stdlib.h>
#include "linkqueue.h"

linkqueue * queue_create() {
    linkqueue *lq;

    if ((lq = (linkqueue *)malloc(sizeof(linkqueue))) == NULL) {
        printf("malloc linkqueue failed\n");
        return NULL;
    }

    lq->front = lq->rear = (linklist)malloc(sizeof(listnode));
    if (lq->front == NULL) {
        printf("malloc node failed\n");
        return NULL;
    }
    lq->front->data = 0;
    lq->front->next = NULL;

    return lq;
}

int enqueue(linkqueue *lq, datatype x) {
    linklist p;

    if (lq == NULL) {
        printf("lq is NULL\n");
        return -1;
    }

    if ((p = (linklist)malloc(sizeof(listnode))) == NULL) {
        printf("malloc node failed\n");
        return -1;
    }
    p->data = x;
    p->next = NULL;

    lq->rear->next = p;
    lq->rear = p;

    return 0;
}

datatype dequeue(linkqueue *lq) {
    linklist p;

    if (lq == NULL) {
        printf("lq is NULL\n");
        return -1;
    }

    p = lq->front;
    lq->front = p->next;
    free(p);
    p = NULL;

    return (lq->front->data);
}

int queue_empty(linkqueue *lq) {
    if (lq == NULL) {
        printf("lq is NULL\n");
        return -1;
    }

    return (lq->front == lq->rear ? 1 : 0);
}

int queue_clear(linkqueue *lq) {
    linklist p;

    if (lq == NULL) {
        printf("lq is NULL\n");
        return -1;
    }

    while (lq->front->next) {
        p = lq->front;
        lq->front = p->next;
        printf("clear free:%d\n", p->data);
        free(p);
        p = NULL;
    }
    return 0;
}

linkqueue * queue_free(linkqueue *lq) {
    linklist p;

    if (lq == NULL) {
        printf("lq is NULL\n");
        return NULL;
    }

    while (lq->front) {
        p = lq->front;
        lq->front = p->next;
        printf("free:%d\n", p->data);
        free(p);
    }

    free(lq);
    lq = NULL;

    return NULL;
}

 

标签:NULL,return,队列,sq,lq,front,数据结构,sequeue
From: https://www.cnblogs.com/shi-zhai/p/17126768.html

相关文章

  • 【数据结构】栈
    栈栈是限制在一端进行插入和删除操作的线性表,其主要特点为“后进先出,先进后出”。 允许操作的一段称为“栈顶”,固定不能够进行操作的一段称为“栈底”。顺序栈相关程......
  • 【数据结构复习】部分知识提纲/总结
    7.2图的存储结构7.4图的连通性问题最小生成树生成树条件:全部顶点部分边无回路最小生成树:权最小的生成树点:prim任取一个点,进入解集对解集画圈,找与圈连接的......
  • 数据结构刷题2023.02.15小记
    各排序算法时间复杂度如何提高哈希表的查找效率Hash表的查找效率取决于散列函数、处理冲突的方法和装填因子。显然,冲突的产生概率与装填因子(表中记录数与表长之比)的大小......
  • 【LeetCode栈与队列#05】滑动窗口最大值
    滑动窗口最大值力扣题目链接(opensnewwindow)给定一个数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。......
  • 数据结构与算法-第01章:顺序表-实现
    一、定义顺序表结构#defineINIT_SIZE10 ///<顺序表初始容量typedefintseqType; ///<定义顺序表元素类型///@brief顺序表结构定义typedefstructt_sqList{ s......
  • 【LeetCode队列#04】逆波兰表达式求值(仍然是经典的栈操作)
    逆波兰表达式求值力扣题目链接(opensnewwindow)根据逆波兰表示法,求表达式的值。有效的运算符包括+,-,*,/。每个运算对象可以是整数,也可以是另一个逆波兰表达......
  • leetcode-数据结构与算法
    第0001题:求两数之和leetcode对应题号:1力扣-原题链接:[请点击此处](https://leetcode.cn/problems/two-sum/"请点击此处")方法一思路暴力破解法,时间复杂度是\(O(n......
  • 从上至下遍历二叉树---队列的性质
    问题:从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。剑指Offer32-I.从上到下打印二叉树-力扣(LeetCode)思路:利用队列先入先出的性质,可以依次打......
  • 【LeetCode队列#03】删除字符串中所有的相邻重复项
    删除字符串中所有的相邻重复项力扣题目链接(opensnewwindow)给出由小写字母组成的字符串S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在S上反复执行重......
  • MQ 消息队列 比较
    为什么需要消息队列削峰业务系统在超高并发场景中,由于后端服务来不及同步处理过多、过快的请求,可能导致请求堵塞,严重时可能由于高负荷拖垮Web服务器。为了能支持最高峰......