• 数据结构之队列


    一、队列定义(实现“先入先出”的存储结构)

    队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

    二、队列分类

    链式队列:类似栈中定义的pTop&pBottom,在链式队列中定义pFront(队列头)&pRear(队列尾)

    静态队列:用数组实现,通必须是循环队列

    循环队列:
    1.静态队列为什么必须是循环队列:必须循环才能利用好数组内存空间
    2.循环队列需要几个参数来确定:front & rear
    3.循环队列各个参数的含义
    在不同场合有不同的含义;
      1)初始化:front & rear 都为零
      2)队列不空:front指向队列首个元素,rear指向队尾元素的下一个无效元素
      3)队列空:front & rear 相等,但是不一定为零
    4.循环队列入队伪算法
      1)元素存入rear指向的位置;
      2)rear = (rear+1)% 数组长度
    5.循环队列出对伪算法讲解
    front = (front+1)% 数组长度
    6.如何判断循环队列为空:front = rear
    7.如何判断循环队列是否已满
    两种方式:
    1)多增加一个标志参数
    2)少使用一个元素-->front和rear挨着
    if( (rear+1)% 数组长度 == front )
         已满
    else
        不满

    三、代码实现

    #include<stdio.h> 
    #include<stdlib.h> 
    #include<malloc.h> 
    
    typedef struct Queue{
        int * pBase;
        int front;
        int rear;
    }QUEUE;
    
    void init(QUEUE *);
    bool empty(QUEUE *);
    bool full(QUEUE *);
    bool in_queue(QUEUE *,int val);
    bool out_queue(QUEUE *,int * pVal);
    void traverse(QUEUE *);
    
    
    int main(void)
    {
        QUEUE Q;
        int val;
        int *pVal = &val;
        init(&Q);
        in_queue(&Q,1);
        in_queue(&Q,2);
        in_queue(&Q,3);
        in_queue(&Q,4);
        in_queue(&Q,5);
        in_queue(&Q,6);
        in_queue(&Q,7);
        traverse(&Q);
        if(out_queue(&Q,pVal))
        {
            printf("出队元素为:%d
    ",*pVal);
            
        }else{
            printf("出队失败
    ");
        }
        traverse(&Q);
        return 0;
    }
    //***********init()初始化******************* 
    void init(QUEUE * pQ)
    {
        pQ->pBase = (int *)malloc(sizeof(int)*6);
        pQ->front = 0;
        pQ->rear = 0;
    }
    //***********empty()判断是否为空******************* 
    bool empty(QUEUE * pQ)
    {
        if(pQ->front == pQ->rear)
        {
            return true;
        }else{
            return false;
        }
    }
    //***********full()判断是否满了******************* 
    bool full(QUEUE * pQ)
    {
        if((pQ->rear+1)%6 == pQ->front)
        {
            return true;
        }else{
            return false;
        }
    }
    //***********in_queue()入队******************* 
    bool in_queue(QUEUE * pQ,int val)
    {
        if(full(pQ))
        {
            return false;
        }else{
            pQ->pBase[pQ->rear] = val;
            pQ->rear = (pQ->rear+1)% 6;
            return true;
        }
    }
    //***********out_queue()出队******************* 
    bool out_queue(QUEUE * pQ,int * pVal)
    {
        if(empty(pQ))
        {
            return false;
        }else{
            * pVal = pQ->pBase[pQ->front];
            pQ->front = (pQ->front+1)% 6;
            return true;
        }
    }
    //***********traverse()遍历******************* 
    void traverse(QUEUE * pQ)
    {
        int i = pQ->front;
        while(i != pQ->rear)
        {
            printf("%d  ",pQ->pBase[i]);
            i = (i+1)% 6;
        }
    }
    View Code
  • 相关阅读:
    [Swift]LeetCode1093. 大样本统计 | Statistics from a Large Sample
    [Swift]鸡尾酒排序 | Cocktail Sort
    [Swift]插入排序 | Insertion sort
    [Swift]求最大公约数和最小公倍数
    [Swift]LeetCode1087. 字母切换 | Permutation of Letters
    [Swift]LeetCode1086. 前五科的均分 | High Five
    [Swift]LeetCode1088. 易混淆数 II | Confusing Number II
    [Swift]LeetCode1090. 受标签影响的最大值 | Largest Values From Labels
    [Swift]LeetCode1091. 二进制矩阵中的最短路径 | Shortest Path in Binary Matrix
    [Swift]LeetCode1092. 最短公共超序列 | Shortest Common Supersequence
  • 原文地址:https://www.cnblogs.com/ljd4you/p/9584040.html
Copyright © 2020-2023  润新知