目录
循环队列
队满:(rear + 1) % QueueSize == front
队空:front == rear
队长:(rear - front + QueueSize) % QueueSize
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 1024
typedef int ElementType;
typedef struct
{
ElementType data[1024];
int front; // 头指针
int rear; // 尾指针
}SqQueue;
int InitQueue(SqQueue * Q); // 初始化队列
int QueueLength(SqQueue Q); // 求队列长度
int FullQueue(SqQueue Q); // 判断队满(满:1;没满;0)
int EmptyQueue(SqQueue Q); // 判断队空(空:1;非空:0)
int EnQueue(SqQueue * Q, ElementType e); // 入队
int DeQueue(SqQueue * Q, ElementType * e); // 出队
int PrintfQueue(SqQueue Q); // 遍历队列
int main()
{
SqQueue Q;
InitQueue(&Q);
PrintfQueue(Q);
EnQueue(&Q, 111);
EnQueue(&Q, 222);
EnQueue(&Q, 444);
PrintfQueue(Q);
int get;
DeQueue(&Q, &get);
printf("出队:%d\n", get);
DeQueue(&Q, &get);
printf("出队:%d\n", get);
PrintfQueue(Q);
EnQueue(&Q, 888);
EnQueue(&Q, 999);
PrintfQueue(Q);
}
// 初始化队列
int InitQueue(SqQueue * Q)
{
Q->front = 0;
Q->rear = 0;
return 1;
}
// 求队列长度
int QueueLength(SqQueue Q)
{
return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
}
// 判断队满(满:1;没满;0)
int FullQueue(SqQueue Q)
{
return (Q.rear + 1) % MAXSIZE == Q.front ? 1 : 0;
}
// 判断队空(空:1;非空:0)
int EmptyQueue(SqQueue Q)
{
return Q.front == Q.rear ? 1 : 0;
}
// 入队
int EnQueue(SqQueue * Q, ElementType e)
{
if (FullQueue(*Q)) { // 判断队满
return 0;
}
Q->data[Q->rear] = e;
Q->rear = (Q->rear +1) % MAXSIZE; // rear指向下一位置
return 1; // 若到最后则转到数组头部
}
// 出队
int DeQueue(SqQueue * Q, ElementType * e)
{
if (EmptyQueue(*Q)) { // 判断队空
return 0;
}
*e = Q->data[Q->front];
Q->front = (Q->front + 1) % MAXSIZE;// front指向下一位置
return 1; // 若到最后则转到数组头部
}
// 遍历队列
int PrintfQueue(SqQueue Q)
{
printf("队列元素:");
if (EmptyQueue(Q)) {
printf("队列为空!");
}
int i;
i = Q.front;
while(i != Q.rear) {
printf("%d ", Q.data[i]);
i = (i + 1) % MAXSIZE;
}
printf("\n");
return 1;
}
链队列
队头指针front指向链队的头结点,不动
队尾指针rear指向终端结点
#include <stdio.h>
#include <stdlib.h>
#define MAXSZIE 1024
typedef int ElementType;
typedef struct QNode // 结点结构
{
ElementType data;
struct QNode * next;
}QNode, * QueuePtr;
typedef struct // 链队列结构
{
QueuePtr front, rear; // 头、尾结点
}LinkQueue;
int InitQueue(LinkQueue * Q); // 初始化链队列
int DestoryQueue(LinkQueue * Q); // 销毁链队列
int ClearQueue(LinkQueue * Q); // 清空链队列
int QueueLength(LinkQueue Q); // 队长
int EnQueue(LinkQueue * Q, ElementType e); // 入队
int DeQueue(LinkQueue * Q, ElementType * e);// 出队
int PrintfQueue(LinkQueue Q); // 遍历链队
int main()
{
LinkQueue Q;
InitQueue(&Q);
PrintfQueue(Q);
EnQueue(&Q, 1111);
EnQueue(&Q, 2222);
EnQueue(&Q, 3333);
EnQueue(&Q, 4444);
PrintfQueue(Q);
int get;
DeQueue(&Q, &get);
printf("出队:%d\n", get);
DeQueue(&Q, &get);
printf("出队:%d\n", get);
PrintfQueue(Q);
ClearQueue(&Q);
PrintfQueue(Q);
}
// 初始化链队列
int InitQueue(LinkQueue * Q)
{
Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode));
if (!Q->front) {
printf("初始化链队列失败!");
}
Q->front->next = NULL;
return 1;
}
// 销毁链队列
int DestoryQueue(LinkQueue * Q)
{
while(Q->front) {
Q->rear = Q->front->next;
free(Q->front);
Q->front = Q->rear;
}
return 1;
}
// 清空链队列
int ClearQueue(LinkQueue * Q)
{
QueuePtr p, q;
Q->rear = Q->front;
p = Q->front->next;
Q->front->next = NULL;
while(p) {
q = p;
p = p->next;
free(q);
}
return 1;
}
// 队长
int QueueLength(LinkQueue Q)
{
int i = 0;
QueuePtr p;
p = Q.front;
while(Q.rear != p) {
i++;
p = p->next;
}
return i;
}
// 入队
int EnQueue(LinkQueue * Q, ElementType e)
{
QueuePtr s = (QueuePtr)malloc(sizeof(QNode)); // 分配结点
if (!s) {
printf("结点内存分配失败!\n");
}
s->data = e;
s->next = NULL;
Q->rear->next = s; // 把拥有元素e新结点s赋给原队尾结点的后继
Q->rear = s; // 把当前s设置为队尾结点,rear指向s
return 1;
}
// 出队
int DeQueue(LinkQueue * Q, ElementType * e)
{
QueuePtr p;
if (Q->front == Q->rear) {
printf("队空!\n");
}
p = Q->front->next;
*e = p->data;
Q->front->next = p->next;
if (Q->rear == p) { // 若队头是队尾,则删除后将rear指向头结点
Q->rear = Q->front;
}
free(p);
return 1;
}
// 遍历链队
int PrintfQueue(LinkQueue Q)
{
printf("队列元素:");
QueuePtr p;
p = Q.front->next;
while(p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
return 1;
}