队列

目录

循环队列

链队列


 循环队列

队满:(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; 
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值