循环队列~基本操作

循环队列与非循环队列的区别:
1~判断队列为空:
             Q->rel==Q->font;
2~判断队列为满:
             非循环队列:Q->rel==size;
             循环队列:   ( Q->rel+1)%size==Q->font; 

 (循环队列需要空出一个位置,且这个位置是不固定的,但它的下标一定为Q->fear-1.
   如果不空出这个位置,那么当Q->rel==Q->font时,队列既可能为空,又可能为满。
   循环队列很好的解决了队列假溢出这个问题。)

3~rel和font下标后移操作:
            非循环队列:++Q->rel;  ++Q->font;
            循环队列:   Q->rel=(Q->rel+1)%size;  Q->font=(Q->font+1)%size; 

4~求队列长度:
            非循环队列:n=Q->rel;
            循环队列:   n=((Q->rel+size)-Q->font)%size;


#include<stdio.h>
#include<stdlib.h>
#define size 5

typedef struct node
{
    int data[size];
    int font;
    int rel;
} Queue,*Queuep;

Queuep creatQueue(Queuep Q)                               //创建队列
{
    int x,i=1;
    printf("请输入第%d个元素:",i++);
    scanf("%d",&x);
    while(x!=-1)
    {
        Q->data[Q->rel++]=x;
        printf("请输入第%d个元素:",i++);
        scanf("%d",&x);
    }
    return Q;
}

void print_Queue(Queuep Q)                                     //打印队列
{
    int i;
    if(isEmpty(Q))
    {
        printf("栈已空!!!\n");
        return Q;
    }
    i=Q->font;
    while(i!=Q->rel)
    {
        printf("%d ",Q->data[i++]);
        if(i==size)                                   //此队列为循环队列
            i=0;
    }
    printf("\n");
}

Queuep in_Queue(Queuep Q,int x)                           //元素入队
{
    if(isFull(Q))
    {
        printf("队列已满!!!\n");
        return Q;
    }
    Q->data[Q->rel]=x;
    Q->rel=(Q->rel+1)%size;                 //此队列为循环队列
    return Q;
}

Queuep out_Queue(Queuep Q)                                //元素出队
{
    if(isEmpty(Q))
    {
        printf("栈已空!!!\n");
        return Q;
    }
    else
    {
        printf("出队的元素为:%d\n",Q->data[Q->font]);
        Q->font=(Q->font+1)%size;               //此队列为循环队列
        return Q;   
    }
}

Queuep get_Queue(Queuep Q)                                //获取队首元素
{
    if(isEmpty(Q))
    {
        printf("栈已空!!!\n");
        return NULL;
    }
    return Q->data[Q->font];
}

int isEmpty(Queuep Q)                                            //判断队空
{
    if(Q->rel==Q->font)
        return 1;
    else
        return 0;
}

int isFull(Queuep Q)                                                //判断队满
{
    if((Q->rel+1)%size==Q->font)
        return 1;
    else
        return 0;
}

int length_Queue(Queuep Q)                                  //求队列长队(元素个数)
{
    return ((Q->rel+size)-Q->font)%size;     //此队列为循环队列
}

int main()
{
    int n;
    int x;
    Queuep Q;
    Q=(Queuep)malloc(sizeof(Queue));
    Q->font=Q->rel=0;

    Q=creatQueue(Q);                                                               //创建队列
    print_Queue(Q);
    printf("队列的长度为:%d\n",length_Queue(Q));

    printf("请输入需要入队的元素:");                                         //元素入队
    scanf("%d",&x);
    Q=in_Queue(Q,x);
    print_Queue(Q);

    Q=out_Queue(Q);                                                              //元素出队
    printf("元素出队后的队列为:");
    print_Queue(Q);

    x=get_Queue(Q);                                                              //获取队首元素
    if(!isEmpty(Q))
    printf("队首元素为:%d\n",x);

    x=length_Queue(Q);                                                         //求队列长度(元素的个数)
    printf("队列长度为:%d\n",x);

    return 0;
}        

猜你喜欢

转载自blog.csdn.net/mycsdn_xm/article/details/80776375