赞
踩
队列也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。
一般队列的顺序存储结构运用的是循环队列,在编写程序之前,需要了解循环队列的相关计算。
初始时:Q.front=Q.rear=0
队空条件:Q.front==Q.rear
队满条件:(Q.rear+1)%MaxSize==Q.front
队头指针进1:Q.front=(Q.front+1)%MaxSize
队尾指针进1:Q.rear=(Q.rear+1)%MaxSize
队列长度:(Q.rear-Q.front+MaxSize)%MaxSize
- #include<stdio.h>
- #include<stdlib.h>
- #define MaxSize 50
- typedef struct //队列的顺序存储结构
- {
- int data[MaxSize]; //存放队列元素
- int front, rear; //队头指针和队尾指针
- }SqQueue;
-
- void Init(SqQueue& Q) //初始化队列
- {
- Q.front = Q.rear = 0; //是0不是空
- }
-
- bool IsEmpty(SqQueue Q) //判队空
- {
- if (Q.front == Q.rear)
- return true;
- else
- return false;
- }
-
- bool Enter(SqQueue& Q, int x) //入队
- {
- if ((Q.rear + 1) % MaxSize == Q.front) //判断队列是否为满
- return false;
- Q.data[Q.rear] = x;
- Q.rear = (Q.rear + 1) % MaxSize;
- return true;
- }
-
- bool Out(SqQueue& Q) //出队
- {
- if (Q.front == Q.rear) //判断队列是否为空
- return false;
- int x = Q.data[Q.front];
- printf("%4d", x);
- Q.front = (Q.front + 1) % MaxSize;
- return true;
- }
-
- int main() {
- SqQueue Q;
- Init(Q);
- int x=0,i=0;
- printf("输入一串数据,以“-99999”结束:");
- while (x != -99999) {
- scanf_s("%d", &x);
- Enter(Q, x);
- i++; //i记录队列中数据元素个数
- }
- printf("\n出队:");
- for(int j=0;j<i-1;j++) //队列中的数据依次出队
- Out(Q);
- }
队列的链式存储结构的主要思想,正是带表头结点的单链表。
与顺序存储不一样的是:
顺序存储中,front指向第一个值,而rear指向最后一个值的后一个位置;
链式存储中,front指向头结点,rear指向最后一个结点。
以下简单地给出队列链式存储的初始化,判队空,进出队的操作。
- #include<stdio.h>
- #include<stdlib.h>
- typedef struct LinkNode //链式队列结点
- {
- int data;
- struct LinkNode* next;
- }LinkNode;
- typedef struct //链式队列
- {
- LinkNode* front, * rear;
- }LinkQueue;
-
- void Init(LinkQueue &Q) //队列初始化
- {
- Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode)); //创建头结点
- Q.front->next = NULL;
- }
-
- bool IsEmpty(LinkQueue Q) //判队空
- {
- if (Q.front == Q.rear)
- return false;
- else
- return true;
- }
-
- void Enter(LinkQueue& Q,int x) //入队
- {
- LinkNode *s = (LinkNode*)malloc(sizeof(LinkNode));
- s->data = x; s->next = NULL;
- Q.rear->next = s;
- Q.rear = s;
- }
-
- bool Out(LinkQueue& Q) //出队
- {
- if (Q.front == Q.rear)
- return false;
- LinkNode* p = Q.front->next;
- int x = p->data;
- printf("%4d", x);
- Q.front->next = p->next;
- if (Q.rear == p) //若队列中只有一个结点,删除后变空
- Q.rear = Q.front;
- free(p);
- return true;
- }
-
- int main() {
- LinkQueue Q;
- Init(Q);
- int x=0,i=0;
- printf("输入一串数据,以“-99999”结束:");
- while (x != -99999) {
- scanf_s("%d", &x);
- Enter(Q, x);
- i++; //i记录队列中数据元素个数
- }
- printf("\n出队:");
- for(int j=0;j<i-1;j++) //队列中的数据依次出队
- Out(Q);
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。