本篇介绍一下编程中比较重要的一个数据结构队列,队列有个很显著的标志,对其中的数据是先进先出,如果是顺序存储结构可以说就是一个受限的数组,对链式存储结构就只能说是符合先进先出的规则了,这种数据结构在我们真正的编程中还是相当常用的。实际中根据需要去定制自己的队列。
开始
顺序队列的操作
首先我们来介绍一下顺序存储结构下的队列的定义和基本操作
添加适当的头文件,定义一个顺序存储数据结构,
这里需要添加头文件和定义一个队列的顺序数据结构
#include
#include
#define MAXSIZE 100
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType *base;
int front;
int rear;
}SqQueue;
初始化一个队列(创建一个队列)
Status InitQueue(SqQueue *q) {
q->base = (ElemType *)malloc(MAXSIZE * sizeof(ElemType));
if (!q->base)
{
exit(0);
}
q->front = q->rear = 0;
return OK;
}
入队操作
Status InsertQueue(SqQueue *q, ElemType e) {
if ((q->rear + 1) % MAXSIZE == q->front)
{
return ERROR;
}
q->base[q->rear] = e;
q->rear = (q->rear + 1) % MAXSIZE;
return OK;
}
出队操作
Status DeleteQueue(SqQueue *q, ElemType *e) {
if (q->front == q->rear)
{
return ERROR;
}
*e = q->base[q->front];
q->front = (q->front + 1) % MAXSIZE;
return OK;
}
主函数
void main() {
SqQueue q;
int a[10];
int i;
InitQueue(&q);
for (i = 0; i < 10; i++)
{
InsertQueue(&q, i + 1);
}
for (i = 0; i < 10; i++)
{
DeleteQueue(&q, &a[i]);
printf("%d\n", a[i]);
}
}
运行结果
都是很基本的操作,在顺序队列中,可以从数组的方式去理解,这样将会让你理解起来更简单
链式队列的操作
首先我们来介绍一下顺序存储结构下的队列的定义和基本操作
添加适当的头文件,定义一个队列链式存储数据结构,
这里需要添加头文件和定义一个队列的链式存储数据结构
#include
#include
#define OK 1;
#define ERROR 0;
typedef int ElemType;
typedef int Status;
typedef struct QNode
{
ElemType data;
struct QNode *next;
}QNode, *QueuePrt;
typedef struct
{
//对头,尾指针
QueuePrt front, rear;
}LinkQueue;
初始化一个队列(创建一个队列)
Status InitQueue(LinkQueue *q) {
q->front = q->rear = (QueuePrt)malloc(sizeof(QNode));
if (!q->front)
{
exit(0);
}
q->front->next = NULL;
return OK;
}
入队操作
Status InsertQueue(LinkQueue *q, ElemType e) {
QueuePrt p = (QueuePrt)malloc(sizeof(QNode));
if (!p)
{
exit(0);
}
p->data = e;
p->next = NULL;
q->rear->next = p;
q->rear = p;
return OK;
}
出队操作
Status DeleteQueue(LinkQueue *q, ElemType *e) {
QueuePrt p;
if (q->front == q->rear)
{
return ERROR;
}
p = q->front->next;
*e = p->data;
q->front->next = p->next;
if (q->rear == p)
{
q->rear = q->front;
}
free(p);
return OK;
}
主函数
void main() {
LinkQueue q;
int a[10];
int i;
InitQueue(&q);
for (i = 0; i < 10; i++)
{
InsertQueue(&q, i + 1);
}
for (i = 0; i < 10; i++)
{
DeleteQueue(&q, &a[i]);
printf("%d\n", a[i]);
}
}
运行结果
在链式存储结构中的队列同样还是相对很简单的,只要理解了先进先出的逻辑,和了解一下指针操作就可以很容易的写出队列的节本操作。
注:
- 上述代码在visual studio 2015中编译成功运行,其他ide请自行测试
- 上述文字皆为个人看法,如有错误或建议请及时联系我