C语言实现队(循环队列)

来源:互联网 发布:数据库置疑的原因 编辑:程序博客网 时间:2024/06/06 08:40

之前用链表实现队,这里用数组实循环队列,今天又看了一下队列,发现少了计算队列长度的函数

队列的实现代码,牺牲一个元素存储空间

#include<stdbool.h>#define maxsize 10typedef int datatype;//定义队的结构体struct queue{    datatype data[maxsize];    int front;    int rear;};typedef struct queue Queue;//初始化队void init(Queue *q){    q->front=q->rear=0;}//判断是否为空//这里有两种方法//先实现牺牲一个存储空间的方法,即rear始终指向空bool Empty(Queue *q){    if(q->front==q->rear)    {        return true;    }    else    {        return false;    }}//判断是否满bool full(Queue *q){    if((q->rear+1)%maxsize==q->front)    {        return true;    }    else    {        return false;    }}//入队void Push(Queue *q,datatype element){    if(!full(q))    {        q->data[q->rear]=element;        q->rear=(q->rear+1)%maxsize;    }    else    {        printf("队满!\n");    }}//出队void Pop(Queue *q){    if(!Empty(q))    {        q->front=(q->front+1)%maxsize;    }    else    {        printf("队空\n");    }}//取队顶元素datatype Top(Queue *q){    if(!Empty(q))    {        return q->data[q->front];    }    else    {        printf("队空\n");    }}


队列的测试代码

#include<stdio.h>#include "CircleQueue.h"int main(){    int i=0;    Queue s;    Queue *q=&s;    // struct stack s;    //初始化队    printf("\n###########初始化队###########\n");    init(q);    printf("----------------------------------");        //入队操作    printf("\n###########入队操作###########\n");    for(i=2;i<=11;i++)    {        Push(q,i);    }    printf("----------------------------------");    //取队顶元素    printf("\n###########取队顶元素###########\n");    printf("%d\n",Top(q));    Pop(q);    Pop(q);    printf("----------------------------------");       //入队操作    printf("\n###########入队操作###########\n");    for(i=215;i<=219;i++)    {        Push(q,i);    }    printf("----------------------------------");     //出队操作    printf("\n###########出队操作###########\n");    for(i=0;i<=10;i++)    {        Pop(q);    }      printf("----------------------------------");    //取队顶元素        printf("\n###########取队顶元素###########\n");    Top(q);    printf("----------------------------------");    // //销毁队    // printf("\n###########销毁队###########\n");     // Push(q,10);    // Destroy(q);    // Top(q);}

设置一个flag的方法,用flag区分队空与非空

#include<stdbool.h>#define maxsize 10typedef int datatype;//定义队的结构体struct queue{    datatype data[maxsize];    int front;    int rear;    int flag; //flag=0时队空,flag=1时队非空};typedef struct queue Queue;//初始化队void init(Queue *q){    q->front=q->rear=0;    q->flag=0;}//判断是否为空//这里有两种方法//先实现牺牲一个存储空间的方法,即rear始终指向空bool Empty(Queue *q){    if(q->flag==0)    {        return true;    }    else    {        return false;    }}//判断是否满bool full(Queue *q){    if(!Empty(q)&&q->rear==q->front)    {        return true;    }    else    {        return false;    }}//入队void Push(Queue *q,datatype element){    if(!full(q))    {        q->data[q->rear]=element;        q->rear=(q->rear+1)%maxsize;        q->flag=1;    }    else    {        printf("队满!\n");    }}//出队void Pop(Queue *q){    if(!Empty(q))    {        q->front=(q->front+1)%maxsize;        if(q->front==q->rear)        {            q->flag=0;        }    }    else    {        printf("队空\n");    }}//取队顶元素datatype Top(Queue *q){    if(!Empty(q))    {        return q->data[q->front];    }    else    {        printf("队空\n");    }}


或者这里把flag改为队长,那么方法简单,在每次入队时加一个元素,出队时减一个元素

0 0
原创粉丝点击