队列
队列是一种操作受限的线性表,只允许在表的一端进行插入,而在另一端进行删除;进行插入的一端为队尾,删除的一端为队头,相对列插入元素时为入队,删除时为出队,典型的先进先出;队首元素为离队头最近的元素;队列一般也分两种储存方式,顺序储存方式和链式储存方式,简称顺序队和链式队。
队列的顺序储存方式
队列的顺序储存方式是在结构体中构建一个数组和两个整形变量,数组用来储存元素,另外两个整形当做队头指针和队尾指针,利用队头指针和队尾指针的用算来将元素存放或输出。
#include<stdio.h>
#include<Windows.h>
#include<stdlib.h>
#include<string.h>
typedef int QElemType;
#define N 20
typedef struct QNode
{
QElemType data[N];
QElemType front,rear;
}LinkQueue;
void LintQueue(LinkQueue *&s)//初始化队列
{
s=(LinkQueue*)malloc(sizeof(LinkQueue));
s->front=s->rear=-1;
}
bool QueueEmpty(LinkQueue*&s)//判断队列是否为空
{
return (s->front==s->rear);
}
int EnQueue(LinkQueue*&s,QElemType e)//入队函数
{
if(s->rear==N-1)
return false;
s->rear++;
s->data[s->rear]=e;
return true;
}
bool DnQueue(LinkQueue *&s,QElemType &e)//出队函数
{
if(s->rear==s->front)
return false;
s->front++;
e=s->data[s->front];
return true;
}
void Destroy(LinkQueue*&s)//销毁队列
{
free(s);
}
bool Gethead(LinkQueue*&s,QElemType e)//
{
if(s->front==s->rear)
return false;
s->front++;
e=s->data[s->front];
return true;
}
void main()
{
int a,b,e,c;
LinkQueue *s;
LintQueue(s);
QueueEmpty(s);
printf("请输入如队个数:");
scanf("%d",&a);
for(b=1;b<=a;b++)
{
printf("第%d个入队的是:",b);
scanf("%d",&e);
EnQueue(s,e);
}
printf("请输入出队个数:\n");
scanf("%d",&c);
while(c>a)
{
printf("请重新输入出队个数:\n");
scanf("%d",&c);
}
for(b=1;b<=c;b++)
{
DnQueue(s,e);
printf("第%d个出队的是:%d\n",b,e);
}
Destroy(s);
system("pause");
}
队列需要多个子函数共同作用才能实现,每一个子函数都有自己的作用,它们分工合作,共同构建了一个完整的队列,并能实现队列的各个功能。
循环队列
上述的队列的顺序储存方式只能储存一次数据,而出队也只是形式上的将队列中的数据打印出来,并没有真正意义上的出队,因此,顺序对列如果想要多次入队和出队,就要用到循环队列,将队列的头部和尾部相连,使构建的队列可以多次进出队列。
队列的链式存储方式
队列的链式存储方式是在用链表的形式构建的,不同于顺序队列的覆盖,链式队列的进出队列都要构建或删除节点,因此,并不会出现队列内空间不足的情况;链式队列储存数据的方法使用结构体储存,也就是节点中的数据域,除此之外,还有队头指针和队尾指针,不同于顺序队列中的用整形变量来定义,链式队列的队头队尾指针都是用结构体指针定义的,队头指针指向链表的头部,队尾指针指向链表的尾部,进队时构建新的内存空间并利用尾插法给链表的尾部插入新的数据,出队时,从队头将数据取出,并把节点的内存释放,完美的实现了队列的定理。
#include<stdio.h>
#include<Windows.h>
#include<stdlib.h>
#include<string.h>
typedef int QElemType;
typedef struct QNode
{
QElemType data;
struct QNode * next;
}QNode,*Queueptr;
typedef struct
{
Queueptr front;
Queueptr rear;
}LinkQueue;
int LintQueue(LinkQueue &Q)
{
Q.front=Q.rear=(Queueptr)malloc(sizeof(QNode));
Q.front->next=NULL;
return 0;
}
int EnQueue(LinkQueue &Q,QElemType e)
{
QNode* p=(QNode*)malloc(sizeof(QNode));
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return 0;
}
int DeQueue(LinkQueue &Q,QElemType &e)
{
QNode*p=(QNode*)malloc(sizeof(QNode));
p=Q.front->next;
e=p->data ;
Q.front->next=p->next;
if(Q.rear=p)
Q.rear=Q.front;
free(p);
return 0;
}
int Destroy(LinkQueue &Q)
{
while(Q.front)
{
Q.rear=Q.front->next;
free(Q.front);
Q.front=Q.rear;
}
return 0;
}
void main()
{
int a,b,e,c;
LinkQueue Q;
LintQueue(Q);
printf("请输入入队个数:");
scanf("%d",&a);
for(b=1;b<=a;b++)
{
printf("第%d个入队的是:",b);
scanf("%d",&e);
EnQueue(Q,e);
}
printf("请输入出队个数:\n");
scanf("%d",&c);
while(c>a)
{
printf("请重新输入出队个数:");
scanf("%d",&c);
printf("\n");
}
for(b=1;b<=c;b++)
{
DeQueue(Q,e);
printf("第%d个出队的是:%d\n",b,e);
}
Destroy(Q);
system("pause");
}