数据结构实现——循环队列

数据结构实现——循环队列

原创不易,转载请声明出处。

刚学队列,若有BUG,欢迎反馈

使用的函数功能介绍

Queue *Creat(int max);

功能:创建空队列,空队列所能容纳的最大值元素个数是max,返回Queue*,作为该队列的指针。

注意:max必须>=0.

特殊情况:当无法申请空间时,返回NULL。

使用方法:

Queue *Q = Creat(2);

int Destroy(Queue* Q)

功能:删除队列,若成功,返回1;

特殊情况:当队列已经被删除(Q为空指针),返回0。

注意:使用之后,一定要立即将指针置空

int Empty(Queue *Q)

功能:判断是否为空,若为空,这返回1,否则返回0.

int Full(Queue* Q)

功能:判断是否已满,若已满,这返回1,否则返回0.

int Push(Queue *Q, Elem e)

功能:向队列中PUSH一个元素。

特殊情况:若队列已满,这返回0,如果正常push,返回1。

int Pop(Queue *Q)

功能:将队列中POP一个元素。

特殊情况:若队列空,这返回0,如果正常,返回1。

Elem GetHead(Queue *Q)

功能:返回队首元素

特殊情况:若队列为空,则程序crash。

Elem GetTail(Queue *Q)

功能:返回队尾元素

特殊情况:若队列为空,则程序crash。

int Size(Queue* Q)

功能:返回队列中的元素个数

源代码

#include <stdio.h>
#include <stdlib.h>
typedef int Elem;
typedef struct Queue
{
    Elem *data;
    int head;
    int tail;
    int size;//仅仅是一个功能,程序的判空,判断满并不依赖。
    int MAX_SIZE;//是真正申请的最大值,实际存放MAX_SIZE-1个。
}Queue;
//函数原形声明
Queue *Creat(int max);
int Size(Queue* Q);
Elem GetTail(Queue *Q);
Elem GetHead(Queue *Q);
int Pop(Queue *Q);
int Push(Queue *Q, Elem e);
int Full(Queue* Q);
int Empty(Queue *Q);
int Destroy(Queue* Q);



Queue *Creat(int max)
{
    if(max <= 0)
        return NULL;
    Elem *D = (Elem*)calloc(max + 1, sizeof(Elem));
    if(!D)
        return NULL;
    Queue *Q = (Queue*)malloc(sizeof(Queue));
    if(!Q)
    {
        free(D);
        return NULL;
    }
    Q->MAX_SIZE = max + 1;
    Q->data = D;
    Q->head = 0;
    Q->tail = 0;
    Q->size = 0;
    return Q;
}

int Destroy(Queue* Q)
{
    if(!Q)
        return 0;
    free(Q->data);
    free(Q);
    return 1;
}
int Empty(Queue *Q)
{
    if(Q->head == Q->tail)
        return 1;
    else
        return 0;
}
int Full(Queue* Q)
{
    if((Q->tail+1)%Q->MAX_SIZE == Q->head)
        return 1;
    else
        return 0;
}

int Push(Queue *Q, Elem e)
{
    if(Full(Q))
       return 0;
    Q->data[Q->tail] = e;
    Q->tail = (Q->tail + 1)%Q->MAX_SIZE;
    Q->size += 1;
    return 1;
}

int Pop(Queue *Q)
{
    if(Empty(Q))
        return 0;
    Q->head = (Q->head + 1) % Q->MAX_SIZE;
    Q->size -= 1;
    return 1;
}

Elem GetHead(Queue *Q)
{
    if(Empty(Q))
    {
        *(int *)NULL;//专门让程序crash
    }
    return Q->data[Q->head];
}
Elem GetTail(Queue *Q)
{
    if(Empty(Q))
    {
        *(int *)NULL;//专门让程序crash
    }
    int t;
    t = Q->tail;
    t -= 1;
    if(t >= 0)
        return Q->data[t];
    else
    {
        return Q->data[Q->MAX_SIZE-1];
    }
}
int Size(Queue* Q)
{
    return Q->size;
}
int main()
{

    Queue *Q = Creat(2);
    printf("size:%d\n",Size(Q));
    printf("empty?:%d\n",Empty(Q));
    Push(Q,1);
    Pop(Q);
    Push(Q,1);
    printf("empty?:%d\n",Empty(Q));
    Push(Q,2);
    printf("%d  %d\n",GetHead(Q),GetTail(Q));
    printf("size:%d\n",Size(Q));
    Pop(Q);
    Pop(Q);
    printf("fault_signal:%d\n",Pop(Q));
    Push(Q,2);
    printf("Size:%d\n",Size(Q));
    Destroy(Q);
    Q = NULL;
    return 0;
}

更多推荐:
数据结构实现——链队列

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构中的表可以分为以下几种类型:线性表、顺序表和链表。线性表是数据结构中最简单的基本数据结构,常见的线性表有数组、链表、栈和队列。顺序表是一种使用一段连续的物理地址存储数据元素的线性结构,通常使用数组来实现。顺序表又可以分为静态顺序表和动态顺序表,其中静态顺序表使用定长数组存储,动态顺序表使用动态分配的数组存储。链表是一种使用指针将数据元素链接起来的线性结构,它可以分为单链表、双链表和循环链表。在链表中,插入和删除操作的时间复杂度为O(N)。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [数据结构——四种最常见的线性表](https://blog.csdn.net/zdl_01/article/details/78806000)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [数据结构三大表](https://blog.csdn.net/weixin_43249530/article/details/97257521)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值