数据结构之第三章之队列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构之第三章之队列相关的知识,希望对你有一定的参考价值。

1~~队列的特点:队列是限定仅在表尾进行插入和表头进行删除操作的线性表,是先进先出的线性表。

    1~~循环队列

               (1)循环队列的循环表示

typedef struct {
        int *base;//初始化的动态分配存储空间
        int front;//头指针,若队列不为空,指向队列头元素
        int rear;//尾指针,若队列不空,指向队列尾元素的下一个位置
}QUEUE;

   若队列不空,尾指针始终指向队列尾元素的下一个位置,也即尾指针始终是"空闲的“,可以起到分隔作用。

   2~~~入队

  

int enqueue(QUEUE head,int e){
        //插入元素e为head的新的队尾元素
        if((head.rear+1)%MAXQSIZE==head.front)
        return 0;//队列满
        head.base[head.rear]=e;
        head.rear=(head+1)%MAXQSIZE;
        return 1;
}

  3~~~出队

int deletequeue(QUEUE head,int e){
        //若队列不空,则删除队列head的队头元素,则用e返回
        if(head.front==head.rear)
            return 0;
        e=head.base[head.front];
        head.front=(head.front+1)%MAXQSIZE;
        return 1;
}

   4~~~判队空

bool queueempty(QUEUE head){
//若队列不空,返回false,否则,返回true
if(head.rear==(head.front+1)%MAXQSIZE)
    return true;
else 
    return false;
}

  5~~~判队满

bool isfullqueue(QUEUE head){
    //若队列为满,则返回true,否则返回false;
    if(head.front==((head.rear+1)%MAXQSIZE))
        return true;
    else 
        return false;
    
}

2链式队列

     (1)链式队列的存储表示

typedef struct Qnode{
        int data;
        struct Qnode *next;
}NODE,*QNODE;
typedef struct{
    QNODE front;//对头指针
    QNODE rear;//队尾指针
}LINKQUEUE;

     链队列包含头指针和尾指针和头节点,当头指针和尾指针相等时,判定链队列为空;

      删除队列头元素时,一般情况下,仅需修改头节点的指针,但当队列中只有最后一个元素被删除后,队列尾指针也将丢失,因此需对队列尾指针重新赋值,而元素入队时,只需修改尾指针。

     (2)  入队(Enqueue)

int Enqueue(LINKQUEUE Q,int e){
        //插入元素为e为Q的新的队尾元素
        newbase=(QNODE)malloc(sizeof(NODE));
        if(!newbase)
            exit(-1);
        newbase->data=e;
        newbase->next=NULL;
        Q.rear->next=newbase;
        Q.rear=newbase;
        return 1;
        
}

       (3)出队

int deletequeue(LINKQUEUE Q,int e){
        //若队列不空,则删除Q的队头元素,用e返回其值
        if(Q.front==Q.rear)
            return 0;
        newbase=Q.front->next;
        e=newbase->data;
        Q.front->next=newbase->next;
        if(Q.rear==newbase)
            Q.rear=Q.front;
        free(newbase);
        return 1;
        
        
}

     (4)判队列

bool queueempty(LINKQUEUE Q)
{
    //若队列空,返回true,否则返回false  
     if(Q.front==Q.rear)
         return true;
     else 
         return false;     
}

 

以上是关于数据结构之第三章之队列的主要内容,如果未能解决你的问题,请参考以下文章

数据结构之第三章之栈

(王道408考研数据结构)第三章栈和队列-第三节1:栈的应用之括号匹配问题和表达式问题(前缀中缀和后缀)

(王道408考研数据结构)第三章栈和队列-第三节2:栈的应用之递归

Java数据结构学习笔记之二Java数据结构与算法之队列(Queue)实现

(王道408考研操作系统)第二章进程管理-第三节6:经典同步问题之生产者与消费者问题

数据结构之链式队列的代码实现及有趣应用