队是限定在表的一端进行插入另一端进行删除的线性表。
特点:先进先出(FIFO),后进后出(LILO)。
包含顺序队和链队:
顺序队:front=rear=0表示队空,入队rear+1,出队:front+1;顺序队的容量定义为M。
但是当front=rear=M时,会导致假溢出,因为此时队里没有元素,却被认为队满了。
解决方案有两个:1,另设一个标志位,区别队满队空,return m;(m代表队中元素的个数);
2,少用一个元素空间。
对于2中的情况:入队时:rear=(rear+1)%M; Q[rear]=x;
出队时:front=(front+1)%M; x=Q[front];
顺序队的定义:
typedef int datatype;
typedef struct sequence
{
datatype q[M];
int front,rear;
}sequence;
入队:
void addq(sequence *s,datatype x)
{
if((s->rear+1)%M==s->front)
cout<<"队满"<<endl;
else
{
s->rear=(s->rear+1)%M;
s->q[s->rear]=x;
}
}
出队:
datatype delcq(sequence *s)
{
if(s->rear==s->front)
{
cout<<"队空"<<endl;
return 0;
}
else
{
s->front=(s->front+1)%M;
return s->q[s->front];
}
}
队的初始化:
void initsq(sequence *s)
{
s->rear=0,s->front=0;
datatype dat=0;
printf("输入一个整数,以0结束\n");
scanf("%d",&dat);
while(dat!=0)
{
addq(s,dat);
scanf("%d",&dat);
}
}
一个完整的代码:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define M 10
typedef int datatype;
typedef struct sequence
{
datatype q[M];
int front,rear;
}sequence;
void addq(sequence *s,datatype x)
{
if((s->rear+1)%M==s->front)
cout<<"队满"<<endl;
else
{
s->rear=(s->rear+1)%M;
s->q[s->rear]=x;
}
}
datatype delcq(sequence *s)
{
if(s->rear==s->front)
{
cout<<"队空"<<endl;
return 0;
}
else
{
s->front=(s->front+1)%M;
return s->q[s->front];
}
}
void initsq(sequence *s)
{
s->rear=0,s->front=0;
datatype dat=0;
printf("输入一个整数,以0结束\n");
scanf("%d",&dat);
while(dat!=0)
{
addq(s,dat);
scanf("%d",&dat);
}
}
int main()
{
sequence *ss;
ss=new sequence;
initsq(ss);
for(int i=0;i<M-1;i++)
{
cout<<delcq(ss)<<endl;
}
cout<<delcq(ss)<<endl;
}
链队:用链表的形式表示的队列
定义:
typedef int datatype;
typedef struct sequence
{
datatype data;
struct sequence *next;
}node;
typedef struct linksequen
{
node *front,*rear;
}sequen;
入队:
void addlinks(sequen *s,datatype x)
{
node *p=new node;
p->data=x;
p->next=NULL;
s->rear->next=p;
s->rear=p;
}
出队:
datatype delink(sequen *s)
{
node *qs;
datatype value;
if(s->front==s->rear)
{
cout<<"队空"<<endl;
return 0;
}
else
{
qs=s->front->next;
value=qs->data;
s->front->next=qs->next;
delete qs;
return value;
}
}
初始化:
void initsq(sequen *s)
{
s->front=s->rear=new node;
if(!(s->front))
cout<<"error"<<endl;
else
s->front->next=NULL;
datatype dat=0;
printf("输入几个整数,以0结束\n");
scanf("%d",&dat);
while(dat!=0)
{
addlinks(s,dat);
scanf("%d",&dat);
}
}
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef int datatype;
typedef struct sequence
{
datatype data;
struct sequence *next;
}node;
typedef struct linksequen
{
node *front,*rear;
}sequen;
void addlinks(sequen *s,datatype x)
{
node *p=new node;
p->data=x;
p->next=NULL;
s->rear->next=p;
s->rear=p;
}
datatype delink(sequen *s)
{
node *qs;
datatype value;
if(s->front==s->rear)
{
cout<<"队空"<<endl;
return 0;
}
else
{
qs=s->front->next;
value=qs->data;
s->front->next=qs->next;
delete qs;
return value;
}
}
void initsq(sequen *s)
{
s->front=s->rear=new node;
if(!(s->front))
cout<<"error"<<endl;
else
s->front->next=NULL;
datatype dat=0;
printf("输入几个整数,以0结束\n");
scanf("%d",&dat);
while(dat!=0)
{
addlinks(s,dat);
scanf("%d",&dat);
}
}
int main()
{
sequen *sque;
sque=new sequen;
initsq(sque);
cout<<delink(sque)<<endl;
}