队列
队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。
队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加。
单链队列
单链队列使用链表作为基本数据结果,所以不存在伪溢出的问题,队列长度也没有限制。但插入和读取的时间代价较高
#include <stdio.h>
#include <stdlib.h>
typedef int Status;
#define TRUE 1;
#define FALSE 0;
#define OK 1;
#define ERROR -1;
#define INFEASBIOLE -2;
#define OVERFLOW 0;
#define STACK_INT_SIZE 100
#define STACKINCREAMENRT 10
//单链队列————队列的链式存储结构
typedef struct QNode
{
QElemtype data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front,rear;
}LinkQueue;
//链队列的基本操作(9个)
Status InitQueue(LinkQueue *Q)
{
//构造一个空队列
Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q->front||!Q->rear)
return OVERFLOW;
Q->front=Q->rear=NULL;
return OK;
}
Stauts DestroyQueue(LinkQueue *Q)
{
//销毁队列Q
while(Q->front)
{
Q->rear=Q->front->next;
free(Q->front);
Q->front=Q->rear;
}
return OK;
}
Status ClearQueue(LinkQueue *Q)
{
//将Q清为空队列
QueuePtr p,q;
Q->rear=Q->front;
p=Q->front->next;
Q->front->next=NULL;
while(p)
{
q=p->next;
free(p);
p=q;
}
return OK;
}
Status QueueEmpty(LinkQueue Q)
{
//判断队列是否为空
if(Q->front->next==NULL)
return TRUE;
return FALSE;
}
int QueueLength(LinkQueue Q)
{
//求队列的长度
int i=0;
QueuePtr p;
p=Q.front;
while(Q.rear!=p)
{
i++;
p=p->next;
}
return i;
}
Status GetHead(LinkQueue Q,QElemType *e)
{
//返回队头元素
if(Q->front==Q->rear)
return ERROR;
QueuePtr p;
p=Q->front->next;
*e=p.data;
return OK;
}
Status EnQueue(LinkQueue *Q,QElenType e)
{
//插入元素e为Q的新队尾元素
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p)
return OVERFLOW;
p->data=e;
p->next=NULL;
Q->rear->next=p;
Q->rear=p;
return OK;
}
Status DeQueue(LinkQueue *Q,QElmtype *e)
{
//删除队头元素并返回
if(Q->front==Q->rear)
return ERROR;
QueuePtr p;
p=Q->front;
*e=p->data;
Q->front=p->next;
if(Q->rear==p)
Q->rear==Q->front;
free(p);
return OK;
}
Status QueueTraverse(LinkQueue Q,int(*vi)(QElemType))
{
//遍历操作
QueuePtr p;
p=Q->rear->next;
while(p)
{
vi(p->data);
p=p->next;
}
printf("\n");
return OK;
}
int main()
{
printf("Hello world!\n");
return 0;
}