队列的定义
与栈结构不同的是,队列的两端都”开口”,要求数据只能从一端进,从另一端出,遵循 “先进先出 FIFO (First In First Out)” 的原则。
通常,称进数据的一端为 “队尾”,出数据的一端为 “队头”,数据元素进队列的过程称为 “入队”,出队列的过程称为 “出队”。
⚠️ 栈和队列不要混淆,栈结构是一端封口,特点是”先进后出”;而队列的两端全是开口,特点是”先进先出”。
队列的顺序存储(循环队列)
在顺序表的基础上实现的队列结构。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| #define MaxSize 100
typedef int ElemType; typedef struct SqQueue{ ElemType data[MaxSize]; int front; int rear; } SqQueue;
void InitQueue(SqQueue &Q){ Q.rear = Q.front = 0; };
bool QueueEmpty(SqQueue Q){ if (Q.rear == Q.front) { return true; }
return false; };
bool EnQueue(SqQueue &Q, ElemType x){ if ((Q.rear + 1) %MaxSize == Q.front) { return false; }
Q.data[Q.rear] = x; Q.rear = (Q.rear + 1) % MaxSize; return true; };
bool DeQueue(SqQueue &Q, ElemType &x){ if (QueueEmpty(Q)) { return false; }
x = Q.data[Q.front]; Q.front = (Q.front + 1) % MaxSize; return true; };
int QueueLength(SqQueue Q){ return (Q.rear-Q.front+MaxSize) % MaxSize; };
|
队列的链式存储
在链表的基础上实现的队列结构。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
typedef struct { LinkNode *front; LinkNode *rear; }LinkQueue;
void InitLinkQueue(LinkQueue &Q){ Q.front = Q.rear = (LinkNode *) malloc(sizeof(LinkNode)); Q.front->next = NULL; };
bool LinkQueueEmpty(LinkQueue Q){ if (Q.front == Q.rear) { return true; }
return false; };
void EnLinkQueue(LinkQueue &Q, ElemType x){ LinkNode *s = (LinkNode*) malloc(sizeof (LinkNode)); s->data = x; Q.rear->next = s; Q.rear = s; };
bool DeLinkQueue(LinkQueue &Q, ElemType &x){ if (LinkQueueEmpty(Q)) { return false; }
LinkNode *p; p = Q.front->next; x = p->data; Q.front->next = p->next; if (Q.rear == p) { Q.rear = Q.front; }
free(p); return true; };
|