zoukankan      html  css  js  c++  java
  • 数据结构 队列

    队列:具有一定操作约束的线性表

    • 插入和删除操作:只能在一端插入,而在另一端删除

    数据插入:入队列(AddQ)

    数据删除:出队列(DeleteQ)

    先来先服务:

    先进先出:FIFO

    队列的抽象数据类型描述

    类型名称:队列(Queue)

    数据对象集:一个有0个或多个元素的又穷线性表

    操作集:长度为MaxSize的队列Q∈Queue,队列元素item∈ElementType

    1、Queue CreateQueue(int MaxSize):生成长度为MaxSize的空队列;

    2、int IsFullQ(Queue Q,int MaxSize):判断队列Q是否已满

    3、void AddQ(Queue Q,ElementType item):将数据元素item插入队列Q中

    4、int IsEmptyQ(Queue Q):判断队列Q是否为空

    5、ElementType DeleteQ(Queue Q):将队头数据元素从队列中删除并返回

    队列的顺序存储实现

    队列的顺序存储结构通常由一个一维数组和一个记录队列头元素位置的变量front以及一个记录队列尾元素位置的变量rear组成。

    循环队列

    #define MaxSize 100
    struct QNode {
        ElementType Data[MaxSize];
        int rear;
        int front;
    };
    typedef struct QNode *Queue;
    定义

    增加队列

    void AddQ(Queue PtrQ, ElementType item)
    {
        if((PtrQ->rear+1)%MaxSize == PtrQ->front) {
            printf("Queue full");
            return;
        }
        PtrQ->rear = (PtrQ->rear+1)%MaxSize;
        PtrQ->Data[PtrQ->rear] = item;
    }
    增加队列

    删除队列

    ElementType DeleteQ(Queue PtrQ)
    {
        if(PtrQ->front == PtrQ->rear) {
            printf("Queue empty");
            return ERROR;
        } else {
            PtrQ->front = (PtrQ->front+1)%MaxSize;
            return PtrQ->Data[PtrQ->front];
        }
    }
    删除队列

     我的使用整合

     1 #define MaxSize 100
     2 
     3 struct QNode {
     4     ElementType Data[MaxSize];
     5     int rear;
     6     int front;
     7 };
     8 typedef struct QNode *Queue;
     9 
    10 int IsEmpty(Queue Q)
    11 {
    12     return (Q->rear == Q->front);   //1:empty 0:not empty
    13 }
    14 
    15 void AddQ(Queue PtrQ, ElementType item)
    16 {
    17     if((PtrQ->rear+1)%MaxSize == PtrQ->front) {
    18         printf("Queue full");
    19         return;
    20     }
    21     PtrQ->rear = (PtrQ->rear+1)%MaxSize;
    22     PtrQ->Data[PtrQ->rear] = item;
    23 }
    24 
    25 ElementType DeleteQ(Queue PtrQ)
    26 {
    27     if(PtrQ->front == PtrQ->rear) {
    28         printf("Queue empty");
    29         return -1;
    30     } else {
    31         PtrQ->front = (PtrQ->front+1)%MaxSize;
    32         return PtrQ->Data[PtrQ->front];
    33     } 
    34 }
    队列

    队列的链式存储实现

      队列的链式存储结构也可以用一个单链表实现。插入和删除操作分别在链表的两头进行;

    队列指针front和rear应该分别指向链表的哪一头?

    struct Node {
        ElementType Data;
        struct Node *Next;
    };
    
    struct QNode {
        struct Node *rear;
        struct Node *front;
    };
    typedef struct QNode *Queue;
    Queue PtrQ;
    定义

    出队操作

    ElementType DeleteQ(Queue PtrQ)
    {
        struct Node *FrontCell;
        ElementType FrontElem;
    
        if(PtrQ->front == NULL) {
            printf("Queue empty");
            return ERROR;
        }
        FrontCell = PtrQ->front;
        if(PtrQ->front == PtrQ->rear)
            PtrQ->front = PtrQ->rear = NULL;
        else
            PtrQ->front = PtrQ->front->Next;
        FrontElem = FrontCell->Data;
        free(FrontCell);
        return FrontElem;
    }
    DeleteQ
    无欲速,无见小利。欲速,则不达;见小利,则大事不成。
  • 相关阅读:
    html+php超大视频上传功能
    html+php超大视频上传教程
    html+php超大视频上传方案
    html+php超大视频上传技术
    html+php超大视频上传实例解析
    html+php超大视频上传示例
    html+php超大视频上传实例
    矩阵求导
    概率密度
    概率分布函数
  • 原文地址:https://www.cnblogs.com/ch122633/p/8598165.html
Copyright © 2011-2022 走看看