队列的概念:
队列是一种数据结构,它遵循先进先出(First-In-First-Out,FIFO)的原则。在队列中,新元素被添加到队列的末尾,并从队列的开头删除元素。
可以将队列类比为现实生活中排队等候的过程。例如,当你在超市排队结账时,先来的人先被服务,后来的人要等待前面的人完成结账才能轮到自己。
队列具有两个基本操作:入队(enqueue):1.将元素添加到队列的末尾。2.出队(dequeue):从队列的开头移除元素
链式结构的存储方式:
之前提到了采用顺序表的循环结构设计了一个循环队列,节省了内存的使用,顺序结构的循环队列像一个甜甜圈,而链式的队列像排队的人,采用链式结构能够极其方便的实现动态扩展、灵活插入和删除、内存利用率高还有可以实现无限长度队列。
代码实现:
typedef int Qelemtype;
typedef struct QNode //定义队列的结点
{
Qelemtype data;
struct QNode *next;
}QNode;
typedef struct //定义队列的数据结构
{
QNode *front;
QNode *rear;
}LinkQueue;
入队:
void Push(LinkQueue &q,int n) //入队操作
{
QNode *p=new QNode; //创建新的指针以及新的结点
p->data=n; //将入队的值插入p的data域中
p->next=NULL;
q.rear->next=p; //将队尾移动到新结点
q.rear=p;
}
出队:
void Pop(LinkQueue &q) //出队操作
{
QNode *p; //将该新的指针指向要删除的结点
int e; //将要删除的结点的值存储到e ,切记此时的e存储的是地址
p=q.front->next; //p指向要删除的结点
e=p->data;
q.front->next=p->next; //将front 指向下一个
delete p;
if(q.rear==p)
{
q.rear=q.front;
}
cout<<"被删除的是:"<<e<<endl;
}
队头节点的数值:
void Getfront(LinkQueue &q)
{
int *e;
e=&(q.front->next->data);
cout<<"队头元素是:"<<*e<<endl;
}
源码:
#include<iostream>
using namespace std;
typedef int Qelemtype;
typedef struct QNode //定义队列的结点
{
Qelemtype data;
struct QNode *next;
}QNode;
typedef struct //定义队列的数据结构
{
QNode *front;
QNode *rear;
}LinkQueue;
void InitQueue(LinkQueue &q) //队列初始化
{
q.rear=q.front=new QNode; //带头结点的队列 ,front 和rear 同时指向这个头结点
q.front->next=NULL; //后续为空
}
void Push(LinkQueue &q,int n) //入队操作
{
QNode *p=new QNode; //创建新的指针以及新的结点
p->data=n; //将入队的值插入p的data域中
p->next=NULL;
q.rear->next=p; //将队尾移动到新结点
q.rear=p;
}
void Pop(LinkQueue &q) //出队操作
{
QNode *p; //将该新的指针指向要删除的结点
int e; //将要删除的结点的值存储到e ,切记此时的e存储的是地址
p=q.front->next; //p指向要删除的结点
e=p->data;
q.front->next=p->next; //将front 指向下一个
delete p;
if(q.rear==p)
{
q.rear=q.front;
}
cout<<"被删除的是:"<<e<<endl;
}
void Getfront(LinkQueue &q)
{
int *e;
e=&(q.front->next->data);
cout<<"队头元素是:"<<*e<<endl;
}
int main()
{
LinkQueue q;
int n;
do
{
cout<<"\t1.初始化\n";
cout<<"\t2.入队\n";
cout<<"\t3.出队\n";
cout<<"\t4.读取队头元素\n";
cout<<"\t0.退出\n";
cout<<"请选择:";
cin>>n;
if(n==1)
{
InitQueue(q);
cout<<"初始化成功!\n\n";
}
if(n==2)
{
int d;
cout<<"请输入入队元素:";
cin>>d;
Push(q,d);
cout<<"入队成功!\n\n";
}
if(n==3)
{
Pop(q);
cout<<"出队成功!!\n";
}
if(n==4)
{
Getfront(q);
}
}while(n!=0);
return 0;
}