循环队列的基本实现

来源:互联网 发布:买卖点炒股软件 编辑:程序博客网 时间:2024/05/22 14:58

 

#include "stdio.h"

#include "stdlib.h"

 

#define Queuesize 6//定义分配的内存空间的大小

 

 

typedef struct

{

    int data[Queuesize];//定义数据域   

    int front, rear;    //因为是用数组来实现,只需要通过下标来定位队列元素即可

    int count;          //计数器,通过计数器来标志队列里的元素的个数,还可以用来判断队列是空还是满

}Squeue;

 

void InitQueue(Squeue *s)

{

    s->front = 0;

    s->rear = 0;//初始化为空,这是为了在C语言中描述方便,约定的,front=rear=0为空队列参考严老师的《数据结构》

    s->count = 0;

    printf("空队列初始化完成......\n");

}

 

int IsEmpty(Squeue *s)//判断对列是否为空

{

    if (s->count == 0)

    {

        printf("**队列为空**\n");

    }

    else

    {

        printf("**队列非空**\n");

    }

    return 0;

}

 

int IsFull(Squeue *s)//判断队列是否满

{

    if (s->count ==Queuesize)

    {

        printf("**队列满**\n");

        return 1;

    }

    else if (s->count >= 0&& s->count < Queuesize)

    {

        printf("**队列不满,可以操作入队**\n");

    }

    /*else if ((s->count > 0 && s->count< Queuesize)||(s->count==0))

    {

        printf("**队列不满,可以操作入队**\n");

    }*/

    /*else if(s->count==0)

    {

        printf("**空队列**\n");

    }*/

    return 0;

}

 

void PushQueue(Squeue *s)//元素入队

{

    int x;

    char y = '0';

    if (IsFull(s))

    {

        //printf("对满,不能入队!!\n");

 

    }

    else

    {

        printf("请以空格连续输入入队元素,回车以结束:\n");

 

        while (y != '\n')

        {

            scanf("%d", &x);

            y= getchar();

            s->data[s->rear] = x;//把x的值赋给rear的位置,然后rear下移

            s->rear = (s->rear + 1) %Queuesize;

            s->count++;//表的长度加一

        }

    }

}

 

void PopQueue(Squeue *s)//元素出队

{

    int x;

    printf("出队...\n");

 

    if (IsEmpty(s))

    {

        printf("队为空,不能出队!!\n");

    }

    else

 

    {

        while (s->count != 0)

        {

 

            x= s->data[s->front];//先读取队头元素,出队完成                            

            s->front = (s->front + 1) %Queuesize;//队头往下移动

            s->count--;//队的长度减1

            printf("%d \n", x);

        }

    }

    printf("出队完成!!\n");

 

}

 

void GetTop(Squeue *s)

{

    if (s->count == 0)

    {

        printf("队列为空,无法获取队头元素!!\n");

    }

    else

    {

        printf("队头元素为:%d\n",s->data[s->front]);

    }

}

 

void Count(Squeue *s)//统计队中元素,获取队长

{

    printf("队列长度为:  \n");

    printf("%d \n", s->count);

 

}

 

void Show(Squeue *s)//观察函数,在把所有的元素都出队后,尝试遍历队中的每一位置,并把其值打印出来,结果读者自己推敲推敲,理解会更深

{

    if (s->count != 0)

    {

        printf("队列中的元素有:\n");

        for (int i = 0; i <s->count; i++)

        {

            printf("%d  \n", s->data[i]);

 

        }

    }

    else

    {

        printf("队列为空,不能遍历\n");

    }

 

    /*int i = 0;

    do

    {

        printf("%d  ", s->data[i]);//do-while循环这段代码作用是当元素出队列后,用来验证原来位置上的值是否改变了

        printf("**************\n");

        i++;

    }while (i < 6);*/

}

void GetLast(Squeue *s)

{

    if (s->count == 0)

    {

        printf("队列为空,无法获取队尾元素\n");

    }

    else

    {

        printf("队尾元素:%d",s->data[s->rear-1]);

    }

}

 

void Display(Squeue *s)

{

 

    for (int i = 0; i <Queuesize; i++)

    {

        printf("%d ", s->data[i]);

    }

 

}

 

void Function()

{

    Squeue s;

    int flag = NULL;

 

    printf("\t********************\n");

    printf("\t循环队列菜单功能实现\n");

    printf("\t********************\n\n");

    printf("\t1:初始化空队\n");

    printf("\t2:判断队列是否为空\n");

    printf("\t3:判断队列是否已满\n");

    printf("\t4:元素入队\n");

    printf("\t5:元素出队\n");

    printf("\t6:获取队头元素\n");

    printf("\t7:获取队列长度\n");

    printf("\t8:遍历队列\n");

    printf("\t9:出队后对空队列行遍历,对比效果\n");

    printf("\t10:获取队尾元素\n");

    printf("\t0:退出\n");

    //printf("\t9:元素出队后对队列进行遍历,观察效果\n");

    printf("\t********************\n");

 

    printf("请输入相应的序号进行操作:\n");

    scanf("%d", &flag);

 

 

    while (1)

    {

        switch (flag)

        {

        case1:InitQueue(&s);

            break;

        case 2:IsEmpty(&s);

            break;

        case 3:IsFull(&s);

            break;

        case4:PushQueue(&s);

            break;

        case 5:PopQueue(&s);

            break;

        case 6:GetTop(&s);

            break;

        case 7:Count(&s);

            break;

        case 8:Show(&s);

            break;

        case 9:Display(&s);

            break;

        case 10:GetLast(&s);

            break;

        case 0:exit(1);

            break;

        default:printf("输入有误!!\n");

        }

        printf("请输入相应的序号进行操作:\n");

        scanf("%d", &flag);

    }

}

 

 

int main()

{

    Function();

    system("pause");

    return 0;

}



 

0 0
原创粉丝点击