(三)普通队列、循环队列、(循环)链队列

文章目录


前言

队列的特点:先进先出

普通队列

1.初始化

#include<stdio.h>
#include<stdlib.h>
#define maxlen 100
struct node
{
	int elem[maxlen];
	int front,rear;
}queue;

void Init()
{
	queue.front=0;
	queue.rear=0;
}

(三)普通队列、循环队列、(循环)链队列

2.入队

void Push(int e)
{
	if(queue.rear==maxlen-1)
	{
		printf("队满!");
	}
	else
	{
		queue.elem[queue.rear++]=e;
	}
}

3.出队

int Pop()
{
	if(queue.front==queue.rear)
	{
		printf("队空!");return -1;
	}
	else
	{
		int f=queue.elem[queue.front];
		queue.elem[queue.front++]='\0';
		return f;
	}
}

4.测试

int main()
{
	Init();
	for(int i=1;i<=5;++i)
	{Push(i);}
	for(int i=1;i<=5;++i)
	{printf("%d ",Pop());}
	printf("\nfront=>%d rear=>%d",queue.front,queue.rear);
	return 0;
}

输出

1 2 3 4 5
front=>5 rear=>5

循环队列

(三)普通队列、循环队列、(循环)链队列

1.初始化

#include<stdio.h>
#include<stdlib.h>
#define maxlen 5
struct node
{
	int elem[maxlen];
	int front,rear;
}queue;

void Init()
{
	queue.front=0;
	queue.rear=0;
}

2.入队

void Push(int e)
{
	if(((queue.rear+1)%maxlen)==queue.front)
	{
		printf("队满!");
	}
	else
	{
		queue.elem[queue.rear++]=e;
		queue.rear%=maxlen;
	}
}

3.出队

int Pop()
{
	if(queue.front==queue.rear)
	{
		printf("队空!");return -1;
	}
	else
	{
		int f=queue.elem[queue.front];
		queue.elem[queue.front++]='\0';
		queue.front%=maxlen;
		return f;
	}
}

4.测试

int main()
{
	Init();
	Push(1);
	Push(2);
	Push(3);
	Push(4);
	Pop();
	Pop();
	Push(5);
	int len=(queue.rear-queue.front+maxlen)%maxlen;
	for(int i=1;i<=len;++i)
	{
		printf("%d ",Pop());
	}
	printf("\nfront=>%d rear=>%d",queue.front,queue.rear);
	return 0;
}

输出

3 4 5
front=>0 rear=>0

链队列

参考本专栏单链表辅助理解
其中尾插法更适合这样的结构
入队走L,出队走queue
主要注意queue如何保持表头地位
以及L如何保持队尾地位

(三)普通队列、循环队列、(循环)链队列

循环链队列

只需将L->next=queue即可
主要注意queue的位置没有元素
所以循环一遍回来后,记得再next一次


总结

栈和队列加入了链的元素后
其实和第一章链表大同小异
有高数和大物那味了,啊嘞 >_<
转载请与博主申明!

上一篇:WeBASE-Front中间件搭建


下一篇:数据结构学习日记(六)