数据结构->队列->顺序循环队列ADT代码

顺序循环队列基于数组实现时,值得注意的就是一下几点:

  1.在头尾指针移动是不是简单的++front/++rear;而是front=(front+1)%Qsize;

  2.队空:rear==front.

  3.队满:front==(rear+1)%Qsize

//顺序循环队
# include<stdio.h>
# include<malloc.h>
# include<math.h>
# define QueueSize 11

//建立一个队列结构体
typedef struct
{
    int front;
    int rear;
    int size;
    int data[QueueSize];
}Queue, *qQueue;

//创建一个队列
qQueue Create()
{
    qQueue Q = (Queue *)malloc(QueueSize * sizeof(Queue));
    Q->front = 0;
    Q->rear = 0;
    Q->size = 0;
    printf("成功建立了一个长度为%d的队列\n", QueueSize-1);
    return Q;
}

//判断队空队满并返回队的长度
int IsFull(qQueue Q)
{    //判断是否队空
    if (Q->rear == Q->front)
    {
        printf("队为空\n");
        Q->size = 0;
        return true;
    }
    else
    {    //判断是否队满
        if ((Q->rear + 1) % QueueSize == 0)
        {
            printf("队为满");
            Q->size = QueueSize;
            return false;
        }
        else
        {    //返回队中的元素个数
            //注释内容为另一种求队列长度的方法
            /*if (Q->rear - Q->front < 0)
            {
                Q->size = Q->rear - Q->front + QueueSize;
            }
            else
            {
                Q->size = Q->rear - Q->front;
            }*/      
            printf("队列中有%d个元素\n", Q->size);
        }
    }
}

//入队
qQueue InQueue(qQueue Q, int P)
{    //判断满,若满返回错误
    if ((Q->rear + 1) % QueueSize == 0)    
        printf("队已满,请执行出队后再进行该操作!");
    else
    {    //队不满,rear=(rear+1)%n
        printf("请输入入队的元素:");
        scanf_s("%d", &P);
        Q->data[Q->rear] = P;
        printf("入队成功!入队元素为:%d\n", Q->data[Q->rear]);
        Q->rear = (Q->rear+1)%QueueSize;
        Q->size = Q->size + 1;
        return Q;
    }

}

//出队
int outQueue(qQueue Q)
{    //判断队是否为空
    if (Q->front == Q->rear)
    {
        printf("队已空,请执行入队操作后再进行该操作");
    }
    else
    {    //队不空front+1
        int n = Q->data[Q->front];
        printf("出队成功,出队元素为:%d\n", n);
        Q->size = Q->size - 1;
        Q->front = (Q->front + 1) % QueueSize;
        return n;
    }
}

//查看队头元素
int frontQueue(qQueue Q)
{
    printf("队头元素为%d", Q->data[Q->front]);
    return Q->data[Q->front];
}

//查看队尾元素
int rearQueue(qQueue Q)
{
    printf("队尾元素为%d", Q->data[Q->rear-1]);
    return Q->data[Q->rear];
}

//打印队列
void printQueue(qQueue Q)
{
    printf("队头<-:");
    int i;
    int j = Q->front;
    for (i = 0; i <= Q->size - 1; i++)
    {
        printf("  %d  ", Q->data[j%QueueSize]);
        j++;
    }
    printf(":<-队尾");
}

//主函数
void main()
{
    Queue q;
    qQueue Q;
    Q = &q;//Q的初始化
    int i;
    do
    {
        printf("\n------------****------------\n");
        printf("请输入要执行的操作序号\n");
        printf("1.建立空队\n");
        printf("2.入队\n");
        printf("3.出队\n");
        printf("4.查看队头元素\n");
        printf("5.查看队尾元素\n");
        printf("6.打印队\n");
        printf("7.判断队空/满,不满返回队的长度\n");
        printf("0.退出");
        printf("\n------------****------------\n");
        printf("请输入序号:");
        scanf_s("%d", &i);
        printf("\n");
        switch (i)
        {
        case 1:Q=Create(); break;
        case 2:InQueue(Q ,i); break;//i为任意的整数,为了节省空间故用i代替
        case 3:outQueue(Q); break;
        case 4:frontQueue(Q); break;
        case 5:rearQueue(Q); break;
        case 6:printQueue(Q); break;
        case 7:IsFull(Q); break;
        case 0:printf("结束"); break;
        default:printf("输入错误!请输入0---6的整数");

        }
    } while (i != 0);
}

.

猜你喜欢

转载自www.cnblogs.com/JQbiu/p/10107591.html