数据结构与算法-队列(队列 循环队列 链式队列)

和昨天的栈有一些类似,小孱弱弱今天分享的数据结构-队列,那是非常有意思~~,顾名思义呀,队列队列,就是排队呀,应该还记得栈的数据操作模式吧,仅在栈尾进行插入和删除操作,我们的队列呢,仅在队列头部删除,队列尾部插入,这就很清楚了吧,队列的应用很广泛,一定要搞清楚里面的思想哦。
进入正题:
先是循环队列,为什么不是顺序队列呢,顺序队列的有很多不足,每次我们做删除操作时,几乎所有元素都要移动,这显然大大提高复杂度,并不是我们想要的,但是循环队列就不一样了,插入删除不需要做大量元素的移动,只需要这是一个指针front指向队头,一个指针指rear向队尾的下一位,并且规定:队列queue满的条件是(rear+1)%QueueSize==front。具体请看代码实现:
相比顺序队列,链式队列的优点就体现出来了,代码实现和原理都非常简单,具体参考代码实现:
还有不明白的地方,请参考单链表

//顺序循环队列(定义)
typedef struct 
{
	int  data[MAXN];
	
	int front;
	
	int rear;
	
	
 } sqQueue;
 //初始化空队列
 int InitQueue(sqQueue *Q) 
 {
 	Q->front=0;
 	
 	Q->rear=0;
 	
 	return true;
 	
 }
//返回队列长度操作
int QueueLength(sqQueue Q)
{
	return (Q.rear-Q.front+MAXN)%MAXN;
 } 
//增
int EnQueue(sqQueue *Q,int e) 
{
	if((Q->rear+1)%MAXN==Q->front)
		return false;
	
	Q->data[Q->rear]=e;
		
	Q->data[Q->rear+1]%MAXN;
	
	return true;
	
}
//删
int DeQueue(sqQueue *Q,int *e)
{
	if(Q->front==Q->rear)
		return false;
		
	*e=Q->data[Q->front];
	
	Q->front=(Q->front+1)%MAXN;
	
	return true;
	
 } 
 //链式队列(定义)
typedef struct QNode
{
	int data;
	
	struct Node *next;
	
 } QNode,*QueuePtr;
 //头尾指针
 typedef struct 
 {
 	QueuePtr front,rear;
 	
 	
  } LinkQueue;
 //增 (入队操作)
 int EnQueueu(LinkQueue *Q,int e)
 {
 	QueuePtr s=(QueuePtr)malloc(sizeof(QNode));
 	
 	if(!s)
 		return false;
 	s->data=e;
 	s->next=NULL;
 	Q->rear->next=s;
 	
 	Q->rear=s; 
 	
 	return true;
 	
 	
  } 
 //删(出队操作)
 int DeQueue(LinkQueue *Q,int *e)
 {
 	QueuePtr p;
 	
 	if(Q->front==Q->rear)
 		return false;
 	p=Q->front->next;
 	
 	p=Q->front->next;
 	
 	*e=p->data;
 	
 	Q->front->next=p->next;
 	
 	if(Q->rear==p)
 		Q->rear=QQ->front;
 	
 	free(p);
 	return true;
 	
  } 

猜你喜欢

转载自blog.csdn.net/weixin_47644373/article/details/106180028