美文网首页
队列及其操作

队列及其操作

作者: 无聊的CairBin | 来源:发表于2021-12-18 18:15 被阅读0次

    队列

    队列的定义

    队列简称队,是一种受限制的线性表,仅允许在表的一端插入,在表的另一端进行删除。

    • 进行插入的一端叫做队头
    • 进行删除的一端叫做队尾

    队的特点

    • 先进先出(FIFO)

    顺序队(循环队列)

    顺序队主要以循环队列的形式出现

    循环队列的要素

    • 队空状态 qu.rear == qu.front
    • 队满状态 (qu.rear+1)%MAXSIZE == qu.front

    结构体定义

    #define MAXSIZE 1024
    
    typedef struct _Queue
    {
        int data[MAXSIZE];  //数据
        int front;  //队首指针
        int rear;   //队尾指针
    }SqQueue;
    

    操作

    采用 p = (p+1)%MAXSIZE;而不是p++的方式移动指针是为了能保证循环再利用性,使其在超过MAXSIZE后能重新回到原始位置

    否则一个队只存满再全部取出后就不能再利用了

    初始化

    //初始化循环队列
    void initQueue(SqQueue &qu)
    {
        qu.front = qu.rear = 0;
    }
    

    判断队空

    //判断队空
    //队空返回真,否则返回假
    bool isQueueEmpty(SqQueue qu)
    {
        if(qu.front == qu.rear) return true;
        else return false;
    }
    

    判断队满

    //判断队满
    //队满返回真,否则假
    bool isQueueFull(SqQueue qu)
    {
        if((qu.rear + 1) % MAXSIZE == qu.front)
            return true;
        else
            return false;
    }
    

    进队

    //进队
    bool enQueue(SqQueue &qu, int e)
    {
        //判断队满
        if(isQueueFull(qu)) return false;
        //若未满,先移动尾指针再存元素
        qu.rear = (qu.rear + 1) % MAXSIZE;
        qu.data[qu.rear] = e;
    
        return true;
    }
    

    出队

    //出队
    bool deQueue(SqQueue &qu, int &e)
    {
        //判断队空
        if(isQueueEmpty(qu)) return false;
        //若不为空,则先移动头指针(因为等于0的时候并无元素,所以可以先移动指针)
        qu.front = (qu.front + 1) % MAXSIZE;
        e = qu.data[qu.front];
    
        return true;
    }
    

    链队

    链队的要素

    • 队空状态 lqu->rear == NULLlqu->front == NULL
    • 队满状态不存在(假设内存无限大)

    结构体定义

    //储存数据的链队结点
    typedef struct QNode
    {
        int data;   //数据域
        struct QNode *next; //指针域
    }QNode;
    
    //头结点定义,用于指示队头和队尾
    typedef struct _LiQueue
    {
        QNode *front;
        QNode *rear;
    }LiQueue;
    

    操作

    初始化

    //初始化
    bool initQueue(LiQueue* &lqu)
    {
        lqu = new LiQueue;
        if(!lqu) return false;
    
        lqu->front = lqu->rear = NULL;
    
        return true;
    }
    

    判断队空

    //判断队空,队空返回真,否则假
    bool isQueueEmpty(LiQueue *lqu)
    {
        if(!lqu->rear || !lqu->front)
            return true;
        else
            return false;
    }
    

    进队

    //入队
    bool enQueue(LiQueue* &lqu, int e)
    {
        QNode *node = new QNode;
        if(!node) return false;
    
        node->data = e;
        node->next = NULL;
    
        //若队为空,则新结点即时队首结点又是队尾结点
        if(!lqu->rear)
            lqu->rear = lqu->front = node;
        else{
            lqu->rear->next = node;
            lqu->rear = node;
        }
    
        return true;
    }
    

    出队

    //出队
    bool deQueue(LiQueue* &lqu, int &e)
    {
        QNode *p;
    
        //判断队空
        if(!lqu->rear) return false;
        else p = lqu->front;
    
        //当队中只有一个保存数据的结点时需特殊操作
        if(lqu->front == lqu->rear)
            lqu->rear = lqu->front = NULL;
        else
            lqu->front = lqu->front->next;
    
        e = p->data;
        delete p;
    
        return true;
    }
    

    相关文章

      网友评论

          本文标题:队列及其操作

          本文链接:https://www.haomeiwen.com/subject/isvgfrtx.html