隊列

隊列

隊列的順序存儲結構

  • 隊列的順序實現數組

    #define MaxSize 10
    typedef struct{
        ElemType data[MaxSize]; //用靜態數組存放隊列元素
        int front,rear;//隊頭指針和隊尾指針
    }SqQueue;
    
    //初始化隊列
    void InitQueue(SqQueue &Q){
        //初始時,隊頭和隊尾指針指向0
        Q.rear = Q.front = 0;
    }
    
    //判斷隊列是否爲空
    bool QueueEmpty(SqQueue Q){
        if(Q.rear == Q.front)//隊空條件
            return true;
        else
            return false;
    }
    
    void testQueue(){
        //聲明一個隊列(順序存儲)
        SqQueue Q;
        InitQueue(Q);
        //.....
    }
  • 入隊操做ide

    bool EnQueue(SqQueue &Q, ElemType x){
    	if((Q.rear + 1) % MaxSize == Q.front)//判斷隊滿
            return false;//隊滿報錯
        Q.data[Q.rear] = x;//將x插入隊尾
        Q.rear = Q.rear+1;//隊尾指針後移
        return true;
    }

    就算rear==MaxSize,隊列也不必定是滿的,由於前面還有出隊的指針

  • 循環隊列的入隊操做code

    bool EnQueue(SqQueue &Q, ElemType x){
    	if((Q.rear + 1) % MaxSize == Q.front)
            return false;//隊滿報錯
        Q.data[Q.rear] = x;//將x插入隊尾
        Q.rear = (Q.rear+1)%MaxSize;//隊尾指針後移
        return true;
    }
  • 出隊操做隊列

    bool DeQueue(SqQueue &Q, ElemType &x){
        if(Q.rear==Q.front)//判斷隊空
            return false;
        x = Q.data[Q.front];
        Q.front = (Q.front + 1)%MaxSize;
        return true;
    }
    
    //得到隊頭元素的值,用x返回
    bool GetHead(SqQueue Q, ElemType &x){
        if(Q.rear == Q.front)
            return false;
        x = Q.data[Q.front];
        return true;
    }
  • 隊列元素個數內存

    (rear+MaxSize-front)%MaxSize
  • 方案二it

    #define MaxSize 10
    typedef struct{
        ElemType data[MaxSize]; //用靜態數組存放隊列元素
        int front,rear;//隊頭指針和隊尾指針
        int size;//隊列當前的長度
    }SqQueue;
    //插入成功
    size++;
    //刪除成功
    size--;
    //此時,判斷隊滿的條件爲
    size == MaxSize;
    //判斷隊空的條件爲
    size == 0;
  • 方案三class

    #define MaxSize 10
    typedef struct{
        ElemType data[MaxSize]; //用靜態數組存放隊列元素
        int front,rear;//隊頭指針和隊尾指針
        int tag;//最近進行的是刪除爲0,插入1
    }SqQueue;//
    
    //每次刪除操做成功時,都令tag=0;
    //每次插入操做成功時,都令tag=1;
    //此時的隊滿條件
    front == rear && tag = 1;
    //此時的隊空條件
    front == reat && tag = 0;
  • 其餘出題方法test

    若是隊尾指針指向的是隊尾元素變量

    那麼在入隊操做時

    Q.rear = (Q.rear + 1)%MaxSize;
    Q.data[Q.rear] = x;

    在初始化的時候,能夠讓front指向0,讓rear指向n-1

    判空:(Q.rear+1)%MaxSize == Q.front

    判滿:1.犧牲一個存儲單元 2.增長輔助變量tag或者size

隊列的鏈式實現

  • 隊列的鏈式實現

    typedef struct LinkNode{//鏈式隊列結點    ElemType data;    struct LinkNode *next;}LinkNode;typedef struct{//鏈式隊列    LinkNode *front,*rear;//隊列的隊頭和隊尾指針}LinkQueue;//初始化(帶頭結點)void InitQueue(LinkQueue &Q){    //初始時,front,rear都指向頭結點    Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));    Q.front ->next = NULL;}//判斷隊列是否爲空(帶頭結點)bool IsEmpty(LinkQueue Q){	if(Q.front == Q.rear)        return true;    else        return false;}//初始化(不帶頭結點)void InitQueue(LinkQueue &Q){    //初始時,front,rear都指向NULL    Q.front = NULL;    Q.rear = NULL;}//判空(不帶頭結點)bool IsEmpty(LinkQueue Q){	if(Q.front == NULL)        return true;    else        return false;}
  • 入隊

    //帶頭結點
    void EnQueue(LinkQueue &Q, ElemType x){
        LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode));
        s->data = x;
        s->next = NULL;
        Q.rear->next = s;//新結點插入到rear以後
        Q.rear = s;//修改表尾指針
    }
    
    //不帶頭結點
    void EnQueue(LinkQueue &Q,ElemType x){
        LinkNode *S = (LinkNode *)malloc(sizeof(LinkNode));
        s->data = x;
        s->next = NULL;
        if(Q.front == NULL){//在空列隊中插入第一個元素
            Q.front = s;//修改隊頭隊尾指針
            Q.rear = s;
        }else{
    		Q.rear->next = s;//新節點插入到rear結點以後
            Q.reat = s;//修改rear指針
        }
    }
  • 出隊

    //帶頭結點
    bool DeQueue(LinkQueue &Q,ElemType &x){
        if(Q.front == Q.rear){
    		return false;//空隊
        }
        LinkNode *p = Q.front->next;
        x = p->data;//用變量x返回隊頭元素
        Q.front->next = p->next;//修改頭結點的next指針
        if(Q.rear = p)//若這次是最後一個結點出隊
            Q.rear = Q.front;//修改rear指針
        free(p);//釋放結點空間
        return true;
    }
    
    //不帶頭結點
    bool DeQueue(LinkQueue &Q,ElemType &x){
    	if(Q.front == NULL)
            return false;//空隊
        LinkNode *p = Q.front;//p指向這次出隊的結點
        x = p->data;//用變量x返回隊頭元素
        Q.front->next = p->next;//修改front指針
        if(Q.rear == p){//這次是最後一個結點出隊
            Q.front = NULL;//front指向NULL
            Q.rear = NULL;//rear指向NULL
        }
        free(p);//釋放結點空間
        return true;
    }
  • 隊滿的條件:鏈式存儲通常不會隊滿,除非內存不足

  • 隊列長度:從front遍歷到rear,length++

相關文章
相關標籤/搜索