队列的实现方式(链表和数组)

  1 #include <stdio.h>                //队列的链表实现方式
  2 #include <stdlib.h>
  3 #include <stdbool.h>
  4
  5
  6 //队列的声明
  7 struct QueueRecord;
  8 typedef struct QueueRecord *QueuePtr;
  9 typedef struct QueueNode *Queue;
 10 typedef int ElementType;
 11
 12 bool IsEmpty(Queue Q);
 13 Queue CreateQueue();
 14 void DisposeQueue(Queue Q);
 15 void Enqueue(ElementType X, Queue Q);
 16 ElementType Dequeue(Queue Q);
 17 void printQueue(Queue Q);
 18
 19 struct QueueRecord {
 20     ElementType Element;
 21     QueuePtr Next;
 22 };
 23
 24 struct QueueNode {
 25     QueuePtr Front;
 26     QueuePtr Rear;
 27 };
 28
 29
 30 int main()
 31 {
 32     int number, flag;
 33     ElementType X;
 34     Queue Q;
 35
 36     printf("|**************队列的基本操作**************|\n");
 37     printf("|******************************************|\n");
 38     printf("|               1. 创建队列                |\n");
 39     printf("|               2. 销毁队列                |\n");
 40     printf("|               3. 入队列                  |\n");
 41     printf("|               4. 出队列                  |\n");
 42     printf("|               5. 输出队列里的元素        |\n");
 43     printf("|******************************************|\n");
 44
 45     flag = 1;
 46     while (flag) {
 47         printf("请选择 : ");
 48         scanf("%d", &number);
 49
 50         switch (number) {
 51             case 1 :
 52                 Q = CreateQueue();
 53                 break;
 54
 55             case 2 :
 56                 if (Q) {
 57                     DisposeQueue(Q);
 58                 } else {
 59                     printf("队列不存在!!!\n");
 60                     exit(-1);
 61                 }
 62                 break;
 63
 64             case 3 :
 65                 if (Q) {
 66                     printf("请输入要入队列的元素:");
 67                     scanf("%d", &X);
 68                     Enqueue(X, Q);
 69                 } else {
 70                     printf("队列不存在!!!\n");
 71                     exit(-1);
 72                 }
 73                 break;
 74
 75             case 4 :
 76                 if (Q) {
 77                     Dequeue(Q);
 78                 } else {
 79                     printf("队列不存在!!!\n");
 80                     exit(-1);
 81                 }
 82                 break;
 83
 84             case 5 :
 85                 if (Q) {
 86                     printQueue(Q);
 87                 } else {
 88                     printf("队列不存在!!!\n");
 89                     exit(-1);
 90                 }
 91                 break;
 92
 93             default :
 94                 printf("操作异常,请按任意键结束!!!");
 95                 flag = 0;
 96         }
 97     }
 98
 99     return 0;
100 }
101
102 bool IsEmpty(Queue Q)
103 {
104     return Q->Front == Q->Rear;
105 }
106
107 Queue CreateQueue()
108 {
109     Queue Q;
110
111     if (!(Q = malloc(sizeof(struct QueueNode))))
112         exit(-1);
113     if (!(Q->Front = Q->Rear = malloc(sizeof(struct QueueRecord))))
114         exit(-1);
115     Q->Front->Next = Q->Rear->Next = NULL;
116
117     return Q;
118 }
119
120 void Enqueue(ElementType X, Queue Q)
121 {
122     QueuePtr P;
123
124     if (!(P = malloc(sizeof(struct QueueRecord))))
125         exit(-1);
126     P->Element = X;
127     P->    Next = NULL;
128     Q->Rear->Next = P;
129     Q->Rear = P;
130 }
131
132 ElementType Dequeue(Queue Q)
133 {
134     QueuePtr P;
135     ElementType X;
136
137     if (IsEmpty(Q)) {
138         printf("队列为空!!!\n");
139         exit(-1);
140     } else {
141         P = Q->Front->Next;
142         X = P->Element;
143         Q->Front->Next = P->Next;
144         if (Q->Rear == P)           //队列中只有一个元素
145             Q->Rear = Q->Front;
146         free(P);
147
148         return X;
149     }
150 }
151
152 void DisposeQueue(Queue Q)
153 {
154     QueuePtr P, TmpCell;
155     P = Q->Front->Next;
156     Q->Front = Q->Rear = NULL;
157     while (P) {
158         TmpCell = P->Next;
159         free(P);
160         P = TmpCell;
161     }
162
163     free(Q);
164 }
165
166 void printQueue(Queue Q)
167 {
168     ElementType X;
169
170     while (!IsEmpty(Q)) {
171         X = Dequeue(Q);
172         printf("%d  ", X);
173     }
174     printf("\n");
175 }
  1 //队列的数组实现方式
  2
  3 #include <stdio.h>
  4 #include <stdlib.h>
  5 #include <stdbool.h>
  6
  7 #define MinQueueSize  (5)        //最小队列大小
  8
  9 //队列的声明
 10 struct QueueRecord;
 11 typedef struct QueueRecord *Queue;
 12 typedef int ElementType;
 13
 14 bool IsEmpty(Queue Q);
 15 bool IsFull(Queue Q);
 16 Queue CreateQueue(int MaxElements);
 17 void DisposeQueue(Queue Q);
 18 void MakeEmpty(Queue Q);
 19 void Enqueue(ElementType X, Queue Q);
 20 ElementType Dequeue(Queue Q);
 21 void printQueue(Queue Q);
 22
 23 struct QueueRecord {
 24     int Capacity;   //容量
 25     int Front;
 26     int Rear;
 27     int Size;
 28     ElementType *Array;
 29 };
 30
 31 int main()
 32 {
 33     int number, flag;
 34     ElementType X, MaxQueueSize;
 35     Queue Q;
 36
 37     printf("|**************队列的基本操作**************|\n");
 38     printf("|******************************************|\n");
 39     printf("|               1. 创建队列                |\n");
 40     printf("|               2. 销毁队列                |\n");
 41     printf("|               3. 入队列                  |\n");
 42     printf("|               4. 出队列                  |\n");
 43     printf("|               5. 输出队列里的元素        |\n");
 44     printf("|******************************************|\n");
 45
 46     printf("请输入队列容量大小 :");
 47     scanf("%d", &MaxQueueSize);
 48
 49     flag = 1;
 50     while (flag) {
 51         printf("请选择 : ");
 52         scanf("%d", &number);
 53
 54         switch (number) {
 55             case 1 :
 56                 Q = CreateQueue(MaxQueueSize);
 57                 break;
 58
 59             case 2 :
 60                 if (Q) {
 61                     DisposeQueue(Q);
 62                 } else {
 63                     printf("队列不存在!!!\n");
 64                     exit(-1);
 65                 }
 66                 break;
 67
 68             case 3 :
 69                 if (Q) {
 70                     printf("请输入要入队列的元素:");
 71                     scanf("%d", &X);
 72                     Enqueue(X, Q);
 73                 } else {
 74                     printf("队列不存在!!!\n");
 75                     exit(-1);
 76                 }
 77                 break;
 78
 79             case 4 :
 80                 if (Q) {
 81                     Dequeue(Q);
 82                 } else {
 83                     printf("队列不存在!!!\n");
 84                     exit(-1);
 85                 }
 86                 break;
 87
 88             case 5 :
 89                 if (Q) {
 90                     printQueue(Q);
 91                 } else {
 92                     printf("队列不存在!!!\n");
 93                     exit(-1);
 94                 }
 95                 break;
 96
 97             default :
 98                 printf("操作异常,请按任意键结束!!!");
 99                 flag = 0;
100         }
101     }
102
103     return 0;
104 }
105
106 bool IsFull(Queue Q)
107 {
108     return Q->Size == Q->Capacity;
109 }
110
111 bool IsEmpty(Queue Q)
112 {
113     return Q->Size == 0;
114 }
115
116 Queue CreateQueue(int MaxElements)
117 {
118     Queue Q;
119
120     if (MaxElements < MinQueueSize) {
121         printf("队列容量太小!!!");
122         exit(-1);
123     }
124     if (!(Q = malloc(sizeof(struct QueueRecord))))
125         exit(-1);
126     if (!(Q->Array = malloc(sizeof(ElementType) * MaxElements)))
127         exit(-1);
128     Q->Capacity = MaxElements;
129     MakeEmpty(Q);
130
131     return Q;
132 }
133
134 void Enqueue(ElementType X, Queue Q)
135 {
136     if (!IsFull(Q)) {
137         Q->Size++;
138         Q->Array[Q->Rear] = X;
139         Q->Rear = ((Q->Rear) + 1) % Q->Capacity;
140     }
141 }
142
143 void MakeEmpty(Queue Q)
144 {
145     Q->Size  = 0;
146     Q->Front = 0;
147     Q->Rear = 0;
148 }
149 ElementType Dequeue(Queue Q)
150 {
151     if (!IsEmpty(Q)) {
152         ElementType X;
153         Q->Size--;
154         X = Q->Array[Q->Front];
155         Q->Front  = ((Q->Front) + 1) % Q->Capacity;
156
157         return X;
158     }
159 }
160
161 void DisposeQueue(Queue Q)
162 {
163     MakeEmpty(Q);
164     free(Q->Array);
165     free(Q);
166 }
167
168 void printQueue(Queue Q)
169 {
170     ElementType X;
171     printf("(打印原理:出队列输出。即打印完成后,队列里再无元素!)\n");
172     while (!IsEmpty(Q)) {
173         X = Dequeue(Q);
174         printf("%d  ", X);
175     }
176     printf("\n");
177 }

  

时间: 2024-10-09 04:37:27

队列的实现方式(链表和数组)的相关文章

33-算法训练 安慰奶牛 - 对象数组排序,对象链表转数组

算法训练 安慰奶牛 时间限制:1.0s   内存限制:256.0MB 问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是一个奶牛的家.FJ计划除去P条道路中尽可能多的道路,但是还要保持牧场之间 的连通性.你首先要决定那些道路是需要保留的N-1条道路.第j条双向道路连接了牧场Sj和Ej(1 <= Sj <= N; 1 <= Ej <= N; Sj != Ej),而且走完它需要Lj的时间.

链表和数组的区别

数组是线性结构,可以直接索引,即要去第i个元素,a[i]即可.链表也是线性结构,要取第i个元素,只需用指针往后遍历i次就可.貌似链表比数组还要麻烦些,而且效率低些. 想到这些相同处中的一些细微的不同处,于是他们的真正不同处渐渐显现了:链表的效率为何比数组低些?先从两者的初始化开始.数组无需初始化,因为数组的元素在内存的栈区,系统自动申请空间.而链表的结点元素在内存的堆区,每个元素须手动申请空间,如malloc.也就是说数组是静态分配内存,而链表是动态分配内存.链表如此麻烦为何还要用链表呢?数组不

更快的方式实现PHP数组去重(转)

概述 使用PHP的array_unique()函数允许你传递一个数组,然后移除重复的值,返回一个拥有唯一值的数组.这个函数大多数情况下都能工作得很好.但是,如果你尝试在一个大的数组里使用array_unique()函数,它会运行地慢一些. 有一个比较好而且更快的函数array_flip()来替代使用array_unique()函数来创建唯一的数组.这个魔法般的函数会交换数组里面每一个元素的键和值,因为键值必须唯一,因此,你会得到跟array_unique()函数一样的结果. 更快的方式实现PHP

将一个已排序的链表或数组转化成一棵平衡二叉树

Problem:Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 解题思路:这里要充分利用元素的有序性,来构造一棵平衡二叉树,这样可以避免为了维持二叉树的平衡性,而进行各种旋转操作.可以每次都向树中插入一个序列中的中间元素,这样就可以保证该结点的左子树和右子树含有结点的数目相等(或只相差一个).这样反复操作,就可以构造一颗类完全

链表和数组的区别在哪里 【微软面试100题 第七十八题】

题目要求: 链表和数组的区别在哪里? 题目分析: 数组静态分配内存,链表动态分配内存: 数组预先定义长度,链表预先无需管理长度: 数组在内存中连续,链表可能连续: 数组元素在栈区,链表元素在堆区: 数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n): 数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1): 数组相对更省空间,存储一个元素链表还需要存储一个next指针: 数组排序相对比链表简单.

链表补充及链表和数组的区别

初稿:2017-11-19 13:05:57 4种链表 不循环单链表:加头结点,使得插入删除操作相同,不必特别处理插入或删除的是第一个位置的情况. 循环单链表:引用参数是最后一个结点的指针pTail,这样既能迅速找到首结点pHead = pTail->next,也能迅速获取表尾. 不循环双向链表:p所指结点后插入结点q.  q->next = p->next; p->next->pre = q; p->next = q; q->pre = p; 循环双向链表:引用

FIFO 队列的链表和数组实现

FIFO (First-in, First-out,先进先出)队列:当执行delete操作时删除那些呆在队列中时间最长的元素. FIFO 队列是这样一个ADT,包含两个基本操作:插入(put)一个新的项.删除(get)一个最早插入的项. 一.FIFO队列的链表实现 FIFO 队列和下堆栈的区别在于新项的插入是在尾部,而不是在头部.因此实现程序要保存一个指向链表最后一个节点的尾指针tail ,因此当Put操作时,将tail 指针指向的next 指向新节点,然后更新tail指针,让它指向那个新的节点

习题3.25 链表和数组对队列例程实现

//链表做队列 /* assume a header */ struct Node; struct Queue; typedef struct Node * PtrToNode; typedef struct Queue * PtrToQ; struct Node{ ElementType ele; PtrToNode Next; }; struct Queue{ PtrToNode rear; PtrToNode front; }; PtrToQ CreateQ( void ) { PtrTo

deque双端队列容器(对象创建,数组、迭代器方式访问,元素的赋值、插入、删除等)

deque与vector非常相似,不仅可以在尾部插入和删除元素,还可以在头部插入和删除.不过当考虑到容器元素的内存分配策略和操作性能时,deque相对vector较为有优势. 头文件 #include<deque> 创建deque对象 1)deque();//创建一个没有任何元素的deque对象. deque<int> d 2)deque(size_typen);//创建一个具有n个元素的deque对象,每个元素采用它的类型下的默认值. deque<int> d(10)