循環隊列~基本操作

循環隊列與非循環隊列的區別:
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;
}        
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章