顺序队列
1.初始化:
front=-1;
rear=-1;
2.判空条件
font=rear;
3.队列已满条件
rear=max-1;
代码:
#include<stdio.h>
#include<stdlib.h>
#define maxn 6
typedef struct node
{
int date[maxn];
int font;
int rear;
}SeqQueue;
void Init(SeqQueue* SQ)//初始化队列
{
SQ->font = -1;
SQ->rear = -1;
}
void EnSeqQueue(SeqQueue* SQ, int value)//入队
{
if (SQ->rear == maxn - 1)
{
printf_s("队列已满");
exit(0);
}
else
{
SQ->date[++SQ->rear] = value;
printf_s("入列成功\n");
}
}
int DeSeqQueue(SeqQueue* SQ)
{
if (SQ->font == SQ->rear)
{
printf_s("队列为空");
return 0;
}
else
{
int value;
value = SQ->date[++SQ->font];
return value;
}
}
循环队列
1.初始化:
front=0;
rear=0;
2.判空条件
font=rear;
3.队列已满条件
少用一个元素空间,指定队头指针所在的位置不用来存放元素。这样当队尾的指针绕一圈追上头指针时队列已满。
font=(rear+1)%max;
代码:
#include<stdio.h>
#include<stdlib.h>
#define m 5
#define maxn m+1
typedef struct node
{
int date[maxn];
int font;
int rear;
}SeqQueue;
void Init(SeqQueue* SQ)//初始化队列
{
SQ->font =0;
SQ->rear =0;
}
void EnSeqQueue(SeqQueue* SQ, int value)//入队
{
if ((SQ->rear+1)%maxn==SQ->font)
{
printf_s("队列已满");
exit(0);
}
else
{
SQ->rear = (SQ->rear + 1) % maxn;//循环
SQ->date[SQ->rear] = value;
printf_s("入列成功\n");
}
}
int DeSeqQueue(SeqQueue* SQ)
{
if (SQ->font == SQ->rear)
{
printf_s("队列为空");
return 0;
}
else
{
SQ->font = (SQ->font + 1) % maxn; //循环
int value;
value = SQ->date[SQ->font];
return value;
}
}
链式队列
为了使队列结构性更强,将头指针与尾指针封装在一个节点中。
1.初始化:让头指针与尾指针一同指向一个空节点。
2.判空条件
font=rear;
3.无队列已满情况
代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int date;
struct node* next;
}LQNode;
typedef struct Queue
{
LQNode* font;
LQNode* rear;
}LQueue;
void Init(LQueue* LQ)
{
LQNode* node;
node = (LQNode*)malloc(sizeof(LQNode));
if (node == NULL)
{
printf_s("申请空间失败\n");
exit(0);
}
else
{
node->next = NULL;
LQ->font = LQ->rear = node;//初始化指向同一个节点
}
}
void En_Link_SeqQueue(LQueue* LQ, int value)
{
LQNode* node;
node = (LQNode*)malloc(sizeof(LQNode));
if (node == NULL)
{
printf_s("申请空间失败\n");
exit(0);
}
else
{
node->next = NULL;
node->date = value;
LQ->rear->next=node;
LQ->rear = node;
}
}
int De_Link_SeqQueue(LQueue* LQ)
{
if (LQ->font == LQ->rear)
{
printf_s("队列为空");
return 0;
}
else
{
int value;
LQNode* node;
node = LQ->font->next;//头指针指向的第一个节点
value = node->date;
LQ->font->next = node->next; //头指针后移
free(node);//释放掉没用用处的空间
if (LQ->font->next == NULL) //表明队列也经为空了
LQ->rear = LQ->font;
return value;
}
}