zoukankan      html  css  js  c++  java
  • 队列

    队列的性质

    1.队列是一种特殊的线性表
    2.队列仅在线性表的两端进行操作
    3.队头(Front):取出数据元素的一端
     4.队尾(Rear):插入数据元素的一端

    队列也有两种存在的形式,顺序和链式。

    链式队列

     1 #include <malloc.h>
     2 #include "LinkList.h"
     3 #include "LinkQueue.h"
     4 
     5 typedef struct _tag_LinkQueueNode
     6 {
     7     LinkListNode header;
     8     void* item;
     9 } TLinkQueueNode;
    10 
    11 LinkQueue* LinkQueue_Create() // O(1)
    12 {
    13     return LinkList_Create();
    14 }
    15 
    16 void LinkQueue_Destroy(LinkQueue* queue) // O(n)
    17 {
    18     LinkQueue_Clear(queue);
    19     LinkList_Destroy(queue);
    20 }
    21 
    22 void LinkQueue_Clear(LinkQueue* queue) // O(n)
    23 {
    24     while( LinkQueue_Length(queue) > 0 )
    25     {
    26         LinkQueue_Retrieve(queue);
    27     }
    28 }
    29 
    30 int LinkQueue_Append(LinkQueue* queue, void* item) // O(n)
    31 {
    32     TLinkQueueNode* node = (TLinkQueueNode*)malloc(sizeof(TLinkQueueNode));
    33     int ret = (item != NULL) && (node != NULL);
    34     
    35     if( ret )
    36     {
    37         node->item = item;
    38         
    39         ret = LinkList_Insert(queue, (LinkListNode*)node, LinkList_Length(queue));
    40     }
    41     
    42     if( !ret )
    43     {
    44         free(node);
    45     }
    46     
    47     return ret;
    48 }
    49 
    50 void* LinkQueue_Retrieve(LinkQueue* queue) // O(1)
    51 {
    52     TLinkQueueNode* node = (TLinkQueueNode*)LinkList_Delete(queue, 0);
    53     void* ret = NULL;
    54     
    55     if( node != NULL )
    56     {
    57         ret = node->item;
    58         
    59         free(node);
    60     }
    61     
    62     return ret;
    63 }
    64 
    65 void* LinkQueue_Header(LinkQueue* queue) // O(1)
    66 {
    67     TLinkQueueNode* node = (TLinkQueueNode*)LinkList_Get(queue, 0);
    68     void* ret = NULL;
    69     
    70     if( node != NULL )
    71     {
    72         ret = node->item;
    73     }
    74     
    75     return ret;
    76 }
    77 
    78 int LinkQueue_Length(LinkQueue* queue) // O(1)
    79 {
    80     return LinkList_Length(queue);
    81 }
      1 #include <stdio.h>
      2 #include <malloc.h>
      3 #include "LinkList.h"
      4 
      5 typedef struct _tag_LinkList
      6 {
      7     LinkListNode header;
      8     int length;
      9 } TLinkList;
     10 
     11 LinkList* LinkList_Create() // O(1)
     12 {
     13     TLinkList* ret = (TLinkList*)malloc(sizeof(TLinkList));
     14     
     15     if( ret != NULL )
     16     {
     17         ret->length = 0;
     18         ret->header.next = NULL;
     19     }
     20     
     21     return ret;
     22 }
     23 
     24 void LinkList_Destroy(LinkList* list) // O(1)
     25 {
     26     free(list);
     27 }
     28 
     29 void LinkList_Clear(LinkList* list) // O(1)
     30 {
     31     TLinkList* sList = (TLinkList*)list;
     32     
     33     if( sList != NULL )
     34     {
     35         sList->length = 0;
     36         sList->header.next = NULL;
     37     }
     38 }
     39 
     40 int LinkList_Length(LinkList* list) // O(1)
     41 {
     42     TLinkList* sList = (TLinkList*)list;
     43     int ret = -1;
     44     
     45     if( sList != NULL )
     46     {
     47         ret = sList->length;
     48     }
     49     
     50     return ret;
     51 }
     52 
     53 int LinkList_Insert(LinkList* list, LinkListNode* node, int pos) // O(n)
     54 { 
     55     TLinkList* sList = (TLinkList*)list;
     56     int ret = (sList != NULL) && (pos >= 0) && (node != NULL);
     57     int i = 0;
     58     
     59     if( ret )
     60     {
     61         LinkListNode* current = (LinkListNode*)sList;
     62         
     63         for(i=0; (i<pos) && (current->next != NULL); i++)
     64         {
     65             current = current->next;
     66         }
     67         
     68         node->next = current->next;
     69         current->next = node;
     70         
     71         sList->length++;
     72     }
     73     
     74     return ret;
     75 }
     76 
     77 LinkListNode* LinkList_Get(LinkList* list, int pos) // O(n)
     78 {
     79     TLinkList* sList = (TLinkList*)list;
     80     LinkListNode* ret = NULL;
     81     int i = 0;
     82     
     83     if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )
     84     {
     85         LinkListNode* current = (LinkListNode*)sList;
     86         
     87         for(i=0; i<pos; i++)
     88         {
     89             current = current->next;
     90         }
     91         
     92         ret = current->next;
     93     }
     94     
     95     return ret;
     96 }
     97 
     98 LinkListNode* LinkList_Delete(LinkList* list, int pos) // O(n)
     99 {
    100     TLinkList* sList = (TLinkList*)list;
    101     LinkListNode* ret = NULL;
    102     int i = 0;
    103     
    104     if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )
    105     {
    106         LinkListNode* current = (LinkListNode*)sList;
    107         
    108         for(i=0; i<pos; i++)
    109         {
    110             current = current->next;
    111         }
    112         
    113         ret = current->next;
    114         current->next = ret->next;
    115         
    116         sList->length--;
    117     }
    118     
    119     return ret;
    120 }
     1 #ifndef _LINKLIST_H_
     2 #define _LINKLIST_H_
     3 
     4 typedef void LinkList;
     5 typedef struct _tag_LinkListNode LinkListNode;
     6 struct _tag_LinkListNode
     7 {
     8     LinkListNode* next;
     9 };
    10 
    11 LinkList* LinkList_Create();
    12 
    13 void LinkList_Destroy(LinkList* list);
    14 
    15 void LinkList_Clear(LinkList* list);
    16 
    17 int LinkList_Length(LinkList* list);
    18 
    19 int LinkList_Insert(LinkList* list, LinkListNode* node, int pos);
    20 
    21 LinkListNode* LinkList_Get(LinkList* list, int pos);
    22 
    23 LinkListNode* LinkList_Delete(LinkList* list, int pos);
    24 
    25 #endif
     1 #ifndef _LINKQUEUE_H_
     2 #define _LINKQUEUE_H_
     3 
     4 typedef void LinkQueue;
     5 
     6 LinkQueue* LinkQueue_Create();
     7 
     8 void LinkQueue_Destroy(LinkQueue* queue);
     9 
    10 void LinkQueue_Clear(LinkQueue* queue);
    11 
    12 int LinkQueue_Append(LinkQueue* queue, void* item);
    13 
    14 void* LinkQueue_Retrieve(LinkQueue* queue);
    15 
    16 void* LinkQueue_Header(LinkQueue* queue);
    17 
    18 int LinkQueue_Length(LinkQueue* queue);
    19 
    20 #endif
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include "LinkQueue.h"
     4 
     5 /* run this program using the console pauser or add your own getch, system("pause") or input loop */
     6 
     7 int main(int argc, char *argv[]) 
     8 {
     9     LinkQueue* queue = LinkQueue_Create();
    10     int a[10] = {0};
    11     int i = 0;
    12     
    13     for(i=0; i<10; i++)
    14     {
    15         a[i] = i + 1;
    16         
    17         LinkQueue_Append(queue, a + i);
    18     }
    19     
    20     printf("Header: %d
    ", *(int*)LinkQueue_Header(queue));
    21     printf("Length: %d
    ", LinkQueue_Length(queue));
    22     
    23     while( LinkQueue_Length(queue) > 0 )
    24     {
    25         printf("Retrieve: %d
    ", *(int*)LinkQueue_Retrieve(queue));
    26     }
    27     
    28     LinkQueue_Destroy(queue);
    29     
    30     return 0;
    31 }

    顺序队列

      1 #include <stdio.h>
      2 #include <malloc.h>
      3 #include "SeqList.h"
      4 
      5 typedef unsigned int TSeqListNode;
      6 
      7 typedef struct _tag_SeqList
      8 {
      9     int capacity;
     10     int length;
     11     TSeqListNode* node;
     12 } TSeqList;
     13 
     14 SeqList* SeqList_Create(int capacity) // O(1)
     15 {
     16     TSeqList* ret = NULL;
     17     
     18     if( capacity >= 0 )
     19     {
     20         ret = (TSeqList*)malloc(sizeof(TSeqList) + sizeof(TSeqListNode) * capacity);
     21     }
     22     
     23     if( ret != NULL )
     24     {
     25         ret->capacity = capacity;
     26         ret->length = 0;
     27         ret->node = (TSeqListNode*)(ret + 1);
     28     }
     29     
     30     return ret;
     31 }
     32 
     33 void SeqList_Destroy(SeqList* list) // O(1)
     34 {
     35     free(list);
     36 }
     37 
     38 void SeqList_Clear(SeqList* list) // O(1)
     39 {
     40     TSeqList* sList = (TSeqList*)list;
     41     
     42     if( sList != NULL )
     43     {
     44         sList->length = 0;
     45     }
     46 }
     47 
     48 int SeqList_Length(SeqList* list) // O(1)
     49 {
     50     TSeqList* sList = (TSeqList*)list;
     51     int ret = -1;
     52     
     53     if( sList != NULL )
     54     {
     55         ret = sList->length;
     56     }
     57     
     58     return ret;
     59 }
     60 
     61 int SeqList_Capacity(SeqList* list) // O(1)
     62 {
     63     TSeqList* sList = (TSeqList*)list;
     64     int ret = -1;
     65     
     66     if( sList != NULL )
     67     {
     68         ret = sList->capacity;
     69     }
     70     
     71     return ret;
     72 }
     73 
     74 int SeqList_Insert(SeqList* list, SeqListNode* node, int pos) // O(n) 
     75 {
     76     TSeqList* sList = (TSeqList*)list;
     77     int ret = (sList != NULL);
     78     int i = 0;
     79     
     80     ret = ret && (sList->length + 1 <= sList->capacity);
     81     ret = ret && (0 <= pos);
     82     
     83     if( ret )
     84     {
     85         if( pos >= sList->length )
     86         {
     87             pos = sList->length;
     88         }
     89         
     90         for(i=sList->length; i>pos; i--)
     91         {
     92             sList->node[i] = sList->node[i-1];
     93         }
     94         
     95         sList->node[i] = (TSeqListNode)node;
     96         
     97         sList->length++;
     98     }
     99     
    100     return ret;
    101 }
    102 
    103 SeqListNode* SeqList_Get(SeqList* list, int pos) // O(1) 
    104 {
    105     TSeqList* sList = (TSeqList*)list;
    106     SeqListNode* ret = NULL;
    107     
    108     if( (sList != NULL) && (0 <= pos) && (pos <= sList->length) )
    109     {
    110         ret = (SeqListNode*)(sList->node[pos]);
    111     }
    112     
    113     return ret;
    114 }
    115 
    116 SeqListNode* SeqList_Delete(SeqList* list, int pos) // O(n)
    117 {
    118     TSeqList* sList = (TSeqList*)list;
    119     SeqListNode* ret = SeqList_Get(list, pos);
    120     int i = 0;
    121     
    122     if( ret != NULL )
    123     {
    124         for(i=pos+1; i<sList->length; i++)
    125         {
    126             sList->node[i-1] = sList->node[i];
    127         }
    128         
    129         sList->length--;
    130     }
    131     
    132     return ret;
    133 }
     1 #ifndef _SEQLIST_H_
     2 #define _SEQLIST_H_
     3 
     4 typedef void SeqList;
     5 typedef void SeqListNode;
     6 
     7 SeqList* SeqList_Create(int capacity);
     8 
     9 void SeqList_Destroy(SeqList* list);
    10 
    11 void SeqList_Clear(SeqList* list);
    12 
    13 int SeqList_Length(SeqList* list);
    14 
    15 int SeqList_Capacity(SeqList* list);
    16 
    17 int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);
    18 
    19 SeqListNode* SeqList_Get(SeqList* list, int pos);
    20 
    21 SeqListNode* SeqList_Delete(SeqList* list, int pos);
    22 
    23 #endif
     1 #include "SeqList.h"
     2 #include "SeqQueue.h"
     3 
     4 SeqQueue* SeqQueue_Create(int capacity) // O(1)
     5 {
     6     return SeqList_Create(capacity);
     7 }
     8 
     9 void SeqQueue_Destroy(SeqQueue* queue) // O(1)
    10 {
    11     SeqList_Destroy(queue);
    12 }
    13 
    14 void SeqQueue_Clear(SeqQueue* queue) // O(1)
    15 {
    16     SeqList_Clear(queue);
    17 }
    18 
    19 int SeqQueue_Append(SeqQueue* queue, void* item) // O(1)
    20 {
    21     return SeqList_Insert(queue, item, SeqList_Length(queue));
    22 }
    23 
    24 void* SeqQueue_Retrieve(SeqQueue* queue) // O(n)
    25 {
    26     return SeqList_Delete(queue, 0);
    27 }
    28 
    29 void* SeqQueue_Header(SeqQueue* queue) // O(1) 
    30 {
    31     return SeqList_Get(queue, 0);
    32 }
    33 
    34 int SeqQueue_Length(SeqQueue* queue) // O(1)
    35 {
    36     return SeqList_Length(queue);
    37 }
    38 
    39 int SeqQueue_Capacity(SeqQueue* queue) // O(1)
    40 {
    41     return SeqList_Capacity(queue);
    42 }
     1 #ifndef _SEQQUEUE_H_
     2 #define _SEQQUEUE_H_
     3 
     4 typedef void SeqQueue;
     5 
     6 SeqQueue* SeqQueue_Create(int capacity);
     7 
     8 void SeqQueue_Destroy(SeqQueue* queue);
     9 
    10 void SeqQueue_Clear(SeqQueue* queue);
    11 
    12 int SeqQueue_Append(SeqQueue* queue, void* item);
    13 
    14 void* SeqQueue_Retrieve(SeqQueue* queue);
    15 
    16 void* SeqQueue_Header(SeqQueue* queue);
    17 
    18 int SeqQueue_Length(SeqQueue* queue);
    19 
    20 int SeqQueue_Capacity(SeqQueue* queue);
    21 
    22 #endif
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include "SeqQueue.h"
     4 
     5 /* run this program using the console pauser or add your own getch, system("pause") or input loop */
     6 
     7 int main(int argc, char *argv[]) 
     8 {
     9     SeqQueue* queue = SeqQueue_Create(20);
    10     int a[10] = {0};
    11     int i = 0;
    12     
    13     for(i=0; i<10; i++)
    14     {
    15         a[i] = i + 1;
    16         
    17         SeqQueue_Append(queue, a + i);
    18     }
    19     
    20     printf("Header: %d
    ", *(int*)SeqQueue_Header(queue));
    21     printf("Length: %d
    ", SeqQueue_Length(queue));
    22     printf("Capacity: %d
    ", SeqQueue_Capacity(queue));
    23     
    24     while( SeqQueue_Length(queue) > 0 )
    25     {
    26         printf("Retrieve: %d
    ", *(int*)SeqQueue_Retrieve(queue));
    27     }
    28     
    29     SeqQueue_Destroy(queue);
    30     
    31     return 0;
    32 }

    队列是一种特殊的线性表
    队列只允许在线性表的头部和尾部进行操作

  • 相关阅读:
    【26.09%】【codeforces 579C】A Problem about Polyline
    【水水水】【洛谷 U4566】赛车比赛
    【24.58%】【BZOJ 1001】狼抓兔子
    【心情】2016ICPC青岛站打铁记
    【record】11.7..11.13
    Identifying a distributed denial of service (DDOS) attack within a network and defending against such an attack
    在页面所有元素加载完成之后执行某个js函数
    day38 01-Spring框架的概
    day37 10-SH整合的案例练习
    day37 09-Struts2和Hibernate整合环境搭建
  • 原文地址:https://www.cnblogs.com/xiaowulang/p/10798102.html
Copyright © 2011-2022 走看看