队列的相关实现

1.队列的链式实现方式


代码如下:

typedef int Datatype;
typedef struct Quene//定义一个结点
{
	Datatype data;
	struct Quene* next;
}Quenu,*Quenuptr;

typedef struct Linkquenu
{
	Quenuptr front, rear;//指向头结点和尾部的指针
	int count;//计数器记录有多少个元素
}Linkquenu;

void Initquene(Linkquenu *L)//初始化队列,创建一个头结点
{
	L->front = L->rear = (Quenuptr)malloc(sizeof(Quenu));
	L->count = 0;
}
void Insertquene(Linkquenu *L, Datatype e)
{
	Quenuptr p = (Quenuptr)malloc(sizeof(Quenu));//开辟第一个结点
	p->data = e;//将数据插入
	L->rear->next =p;//头结点指向第一个结点
	L->rear = p;//指向最后一个结点
	p->next = NULL;
	L->count++;
}
void popelem(Linkquenu *L, Datatype *e)//出队列操作
{
	if (L->front == L->rear)//没有元素
	{
		return;
	}
	Quenuptr p = L->front->next;//记录第一个结点的值
	L->front->next = p->next;//第二个结点给头结点,如果只有一个结点此时将front置空了所以下面要进行判断
	*e =p->data;//赋值
	if (L->rear == p)//如果只有一个结点的话
	{
		L->rear = L->front;//将rear也置空
	}
	free(p);//释放第一个结点
}
int  Getelem(Linkquenu *L)//获取队列元素
{
	return L->count;
}
void DestroyQ(Linkquenu *L)//销毁队列
{
	while (L->front)
	{
		L->rear = L->front->next;//把第一个结点的位置记下来
		free(L->front);
		L->front = L->rear;//L->front指向第一个结点
	}
}
int main()
{
	Linkquenu link;
	Initquene(&link);
	for (int i = 0; i < 10; i++)
	{
		Insertquene(&link, i+1);
	}
	int len = Getelem(&link);
	int e;
	for (int i = 0; i < len; i++)
	{
		popelem(&link, &e);
		printf("%d ",e);
	}
	system("pause");
	return 0;
}


2.循环队列

因为顺序栈很容易出现假溢出的现象,所以就有了循环队列




代码如下:

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<math.h>
#define MAX 10

typedef int Datatype;
typedef struct circleQ
{
	Datatype *data;
	int front;
	int rear;
}circleQ,*circleQptr;
void InitcircleQ(circleQptr s)//初始化队列
{
	s->data = (Datatype *)malloc(sizeof(Datatype)*MAX);//申请空间
	if (s->data == NULL)
		return;
	else
	{
		s->front = 0;
		s->rear = 0;
	}
}
void Pushelem(circleQptr s, Datatype e)
{
	if ((s->rear + 1 )% MAX== s->front)//判断队列是否满了
	{
		return;
	}
	s->data[s->rear] = e;//赋值
	s->rear = (s->rear + 1) % MAX;
}
void Popelem(circleQptr s, Datatype *e)//弹出元素
{
	if (s->front% MAX == s->rear)//队列已经满了
	{
		return;
	}
	else
	{
		*e = s->data[s->front];
		s->front = (s->front + 1) % MAX;
	}
}
int Getcount(circleQptr s)//或者
{
	return (int)fabs(s->front - s->rear);
}
int main()
{
	circleQ QQ;
	InitcircleQ(&QQ);
	Pushelem(&QQ,1);
	Pushelem(&QQ, 2);
	Pushelem(&QQ, 3);
	Pushelem(&QQ, 4);
	int len = Getcount(&QQ);
	for (int i = 0; i <10; i++)
	{
		int e;
		if (Popelem(&QQ, &e)==0)
		{
			break;
		}
		printf("%d ", e);
	}
	system("pause");
	return 0;
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值