循环队列
#include <iostream>
using namespace std;
#define MAXSIZE 100
typedef struct
{
int *base;//存储空间的基地址
int front;//头指针
int rear;//尾指针
}SqQueue;
void InitQueue(SqQueue &Q)
{
Q.base=new int[MAXSIZE];
Q.front=Q.rear=0;
}
int QueueLength(SqQueue Q)//求队列长度
{
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
void EnQueue(SqQueue &Q,int e)//入队
{
if((Q.rear+1)%MAXSIZE==Q.front){cout<<"队满"<<endl;return;}
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXSIZE;
}
void DeQueue(SqQueue &Q,int &e)//出队
{
if(Q.front==Q.rear){cout<<"队空"<<endl;return;}
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXSIZE;
}
int GetHead(SqQueue Q)//获取队首元素
{
if(Q.front!=Q.rear)
return Q.base[Q.front];
}
int main()
{
SqQueue Q;
InitQueue(Q);
EnQueue(Q,1);
EnQueue(Q,5);
EnQueue(Q,7);
int ans1=GetHead(Q);
cout<<ans1<<endl;
DeQueue(Q,ans1);
cout<<ans1<<endl;
DeQueue(Q,ans1);
cout<<ans1<<endl;
int length=QueueLength(Q);
cout<<length<<endl;
return 0;
}
链队
#include <iostream>
using namespace std;
//一个链队显然需要两个分别指示队头和队尾的指针(分别称为头指针和尾指针)才能唯一确定。
typedef struct QNode
{
int data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;//队头指针
QueuePtr rear;//队尾指针
}LinkQueue;
void InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=new QNode;//生成新结点作为头结点,队头和队尾指针指向此结点
Q.front->next=NULL;//头结点的指针域为空
}
void EnQueue(LinkQueue &Q,int e)
{//插入元素e
QNode *p;
p=new QNode;
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
}
void DeQueue(LinkQueue &Q,int &e)
{//删除队头元素,用e返回其值
if(Q.front==Q.rear){cout<<"队空"<<endl;return;}
QNode *p;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p)Q.rear=Q.front;
delete p;
}
int GetHead(LinkQueue Q)
{//返回队头元素,不修改队头指针
if(Q.front!=Q.rear)
return Q.front->next->data;
}
int main()
{
LinkQueue Q;
InitQueue(Q);
EnQueue(Q,1);
EnQueue(Q,5);
EnQueue(Q,7);
int ans1=GetHead(Q);
cout<<ans1<<endl;
DeQueue(Q,ans1);
cout<<ans1<<endl;
DeQueue(Q,ans1);
cout<<ans1<<endl;
return 0;
}