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

    一:队列

    队列(Queue):具有一定操作约束的线性表
    插入和删除操作:只能在一端插入,而在另一端删除。
    先来先服务
    先进先出:FIFO
     

    二:队列的抽象数据类型描述

    类型名称:队列(Queue)

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

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

    1、Queue CreatQueue( 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( Qucue Q):将队头数据元素从队列中删除并返回。

     

    三:队列的顺序存储实现

    队列的顺序存储结构通常由一个一维数组和一个记录队列头元素位置的变量front 以及一个记录队列尾元素位置的变量rear组成。
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #define ElementType int 
     4 #define  MAXSIZE  4
     5 typedef struct QNode* Queue;
     6 struct QNode
     7 {
     8     ElementType Data[MAXSIZE];
     9     int front; //对头
    10     int rear;  //对尾
    11 };
    12 Queue CreateQueue()
    13 {
    14     Queue Q;
    15     Q = (Queue)malloc(sizeof(struct QNode));
    16     Q->front = 0;
    17     Q->rear  = 0;
    18 }
    19 //判断队列是否满
    20 int isFull(Queue Q)
    21 {
    22     return ((Q->rear + 1) % MAXSIZE == Q->front);
    23 }
    24 void AddQ(ElementType item,Queue PtrQ)
    25 {
    26     //判断队列是否满
    27     if(isFull(PtrQ))
    28     {
    29         printf("队列满
    ");
    30         return;
    31     }
    32     //添加元素
    33     PtrQ->rear = (PtrQ->rear + 1) % MAXSIZE;
    34     PtrQ->Data[PtrQ->rear] = item;
    35 }
    36 //判断队列是否空
    37 int isEmpty(Queue Q)
    38 {
    39     return (Q->front == Q->rear);
    40 }
    41 //出队
    42 ElementType DeleteQ(Queue PtrQ)
    43 {
    44     //判断队列是否空
    45     if(isEmpty(PtrQ))
    46     {
    47         printf("队列空
    ");
    48         return 0 ; 
    49     }
    50     PtrQ->front = (PtrQ->front + 1) % MAXSIZE;
    51     return PtrQ->Data[PtrQ->front];
    52 }
    View Code

    三:队列的链式存储实现

    队列的链式存储结构也可以用一个单链表来实现。插入和删除操作分别在链表二头进行。
    现在有一个问题,front 【头指针,删除元素】和 rear【尾指针,添加元素】 分别指向链表哪一头?
    肯定是front 放在链表前【便于删除】,rear放在链表后【这个无论表头、表尾都可以】

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #define ElementType int 
     4 typedef struct QNode* Queue;
     5 struct Node
     6 {
     7     ElementType Data;
     8     struct Node* next;
     9 
    10 };
    11 struct QNode
    12 {
    13     struct Node *front; //
    14     struct Node* rear;  //
    15 };
    16 Queue CreateQueue()
    17 {
    18     Queue Q = (Queue)malloc(sizeof(struct QNode));
    19     Q->front = Q->rear = NULL;
    20     return Q;
    21 }
    22 //队列是否空
    23 int isEmpty(Queue queue)
    24 {
    25     
    26     return (queue->front == NULL);
    27 }
    28 //入队
    29 void AddQ(ElementType item, Queue queue)
    30 {
    31 
    32     struct Node* node = (struct Node *)malloc(sizeof(struct Node));
    33     node->Data = item;
    34     node->next = NULL;
    35     //若队列为空
    36     if(queue->rear == NULL) 
    37     {
    38         queue->rear  = node;
    39         queue->front = node;
    40     }
    41     else //若队列不为空
    42     {
    43         queue->rear->next = node;
    44         queue->rear = node;
    45     }
    46 }
    47 //出队
    48 ElementType DeleteQ(Queue queue)
    49 {
    50     //判断队列为空
    51     if(isEmpty(queue))
    52     {
    53         printf("队列为空
    ");
    54         return 0;
    55     }
    56     struct Node* frontCell;
    57     ElementType item;
    58     frontCell = queue->front;
    59     if(queue->front == queue->rear) //说明队列只有一个元素
    60     {
    61         queue->front = queue->rear = NULL;
    62     }
    63     else
    64     {
    65         queue->front = queue->front->next;
    66     }
    67     item = frontCell->Data;
    68     free(frontCell);
    69     return item;
    70 }
    View Code
  • 相关阅读:
    获取系统当前时间
    使用键盘控制窗体的移动
    打开和关闭输入法编辑器
    屏蔽系统的Ctrl+c/x/v操作
    按Esc键实现关闭窗体
    屏蔽Alt+F4关闭窗体
    将回车键转换为Tab键
    node.js入门学习(六)--express
    curl POST如何查看响应的Header(转)
    node.js入门学习(五)--Demo模块化改造
  • 原文地址:https://www.cnblogs.com/Yzengxin/p/13866270.html
Copyright © 2011-2022 走看看