用两种方法来实现循环队列

本文对比了使用单链表和顺序表实现队列的方法,详细介绍了两种实现方式的代码结构和核心逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

队列有很多种不同的表示方法,这里简单的介绍两种

一,用单链表实现
////////////////////////////////////////////////head.h////////////////////////////////////////////
#include <iostream>
using namespace std;

struct QNode
{
char data;//data作为一个存放的数据char可以随便换
QNode *next;//其实就像单链表一样
};

struct LinkQueue
{
QNode* front;//队头指针
QNode* rear;//队尾指针
};
////////////////////////////////////head.cpp//////////////////////////////////////////////////////////
#include "head.h"

bool initQueue(LinkQueue &Q)
{
Q.front=Q.rear=(QNode *)malloc(sizeof(QNode));
if(!Q.front)
{
return false;
}
Q.front->next=NULL;
return true;
}

bool enterQueue(LinkQueue &Q,char e)
{
QNode *p=(QNode *)malloc(sizeof(QNode));
if(!p)
{
return false;
}
p->data=e;
p->next=NULL;
Q.rear->next=p;//指向插入的新元素
Q.rear=p;//尾指针指向最后一个元素
return true;
}

void getHead(LinkQueue &Q)
{
if(Q.front==Q.rear)
{
cout<<"空队"<<endl;
abort();
}
cout<<"第一个元素是:"<<Q.front->next->data<<endl;
}
bool deleteQueue(LinkQueue &Q)
{
if(Q.front==Q.rear)
{
cout<<"空队"<<endl;
return false;
}
QNode *p;
p=Q.front->next;
Q.front->next=p->next;
//但是要注意只有一个元素的情况
if(Q.rear==p)
{
Q.rear=Q.front;
}
free(p);
return true;
}


二,用顺序表实现
///////////////////////////////////////////////////head.h//////////////////////////////////////////////////
#include <iostream>
using namespace std;

#define queueSize 40

struct student 
{
char NO[10];
char name[20];
};

struct SQueue
{
student queue[queueSize];
int front, rear;
};
////////////////////////////////////////////////head.cpp///////////////////////////////////////////////////
#include "head.h"

void initQueue(SQueue &Q)
{
Q.front=Q.rear=0;
}

bool QueueEmpty(SQueue Q)
{
if(Q.front==Q.rear)
{
cout<<"队列为空"<<endl;
return true;
}
else
{
cout<<"队列不为空"<<endl;
return false;
}
}

bool enterQueue(SQueue &Q, student p)
{
if(Q.rear==queueSize)
{
return false;
}

/*cout<<"输入学号:";
cin>>p.NO;
cout<<"输入姓名:";
cin>>p.name;*/

Q.queue[Q.rear]=p;
Q.rear++;
return true;
}

void getHead(SQueue Q)
{
cout<<"队列的第一个元素"<<endl;
cout<<Q.queue[Q.front].NO<<"   "<<Q.queue[Q.front].name<<endl;
}

bool deleteQueue(SQueue &Q)
{
if(Q.front==Q.rear)
{
cout<<"队列为空"<<endl;
return false;
}
Q.front=Q.front+1;
return true;
}
///////////////////////////////////////main.cpp///////////////////////////////////////////////
#include "head.h"

void initQueue(SQueue &Q);
bool QueueEmpty(SQueue Q);
bool enterQueue(SQueue &Q, student p);
void getHead(SQueue Q);
bool deleteQueue(SQueue &Q);

void main()
{
SQueue Q;
student p;
initQueue(Q);
for(int i=0; i<3; i++)
{
cout<<"输入第"<<i+1<<"个同学的信息(学号,姓名)"<<endl;
cin>>p.NO;
cin>>p.name;
enterQueue(Q,p);
}
getHead(Q);

deleteQueue(Q);
getHead(Q);
}


因为技术有限,上面可能有错,所以请多多指教!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值