typedef struct{
QelemType *base;
int front;
int rear;
}squene;
约定:空队列 Q.front=Q.rear
队满 Q.front=(Q.rear+1)%MAXSIZE
入队 Q.rear++
出队 Q.front++
非空队列:front始终指向队头元素,rear始终指向队尾元素的下一位置
每插入一个元素,rear=(rear+1)%(MAXSIZE)
每删除一个元素,front=(front+1)%(MAXSIZE)
循环队列示意图
初始化
void Initquene(squene &s){
s.base=(QelemType *)malloc(sizeof(QelemType));
if(!s.base)
exit(-1);
s.front=0;
s,rear=0;
}
入队操作
void enquene(squene &s,QelemType e){
if(((s.base+1)%MAXSIZE)==s.front){
printf("队满");
exit(-1);
}
s.base[s.rear]=e;
s.rear=(s.rear+1)%MAXSIZE;
}
出队操作
void dequene(squene &s,QelemType e){
if(s.rear==s.front){
printf("栈空");
exit(-1);
}
e=s.base[s.front];
s.front=(s.front+1)%MAXSIZE;
}
求队的长度
int length(squene s){
return (s.rear-s.front+1) % MAXSIZE;
}
全部代码为:
#include
#include
#define MAXSIZE 100
typedef int QelemType;
typedef struct{
QelemType *base;
int front;
int rear;
}squene;
void Initquene(squene &s){
s.base=(QelemType *)malloc(MAXSIZE * sizeof(QelemType));
if(!s.base)
exit(-1);
s.front=0;
s.rear=0;
}
void enquene(squene &s,QelemType e){
if((s.rear+1)%MAXSIZE==s.front){
printf("duimanb");
exit(0);
}
s.base[s.rear]=e;
s.rear=(s.rear+1)%MAXSIZE;
}
void dequene(squene &s,QelemType e){
if(s.rear==s.front){
printf("栈空");
exit(-1);
}
e=s.base[s.front];
s.front=(s.front+1) % MAXSIZE;
}
int length(squene s){
return (s.rear-s.front+MAXSIZE) % MAXSIZE;
}
int main(){
squene s;
Initquene(s);
int m,n;
scanf("%d",&n);
for(int i=0;i
5、链队
链队的定义
typedef struct QNode{
QElemType data;
struct QNode *next;
}Qnode,*Queneptr;
typedef struct{
Queneptr front;//队头指针
Queneptr rear;//队尾指针
}LinkQuene;
约定:
队空:s.front=s.rear(有头结点)
s.front=NULL(无头结点)
链队无队满的情况(假定内存足够大)
进队操作
s->rear->next=p;
s->rear=p;
出队操作
p=s->front;
s->front=p->next;(或者s->front=s->front->next;)
x=p->data;
free ( p );
算法实现
1、初始化
Initquene(LinkQuene &s){
s.front=(Queneptr *)malloc(sizeof(Qnode));
if(!s.front)
exit(-1);
s.rear=s.front;
s.front->next=NULL;
}
2、判断队空
int isqueneempty(LinkQuene &s){
if(s.rear==NULL||s.front==NULL)
return 1;
return 0;
}
3、入队
void enquene(LinkQuene &s,QElemType e){
Queneptr p=(Queneptr *)malloc(sizeof(Qnode));
if(!p)
exit(-1);
p->data=e;
p->next=NULL;
s.rear->next=p;
s.rear=p;
}
4、出队
void dequene(LinkQuene &s,QElemType &e){
if(s.rear==NULL||s.front==NULL){
printf("对空");
exit(-1);
}
Queneptr p=s.front->next;
e=p->data;
s.front->next=p->next;
if(s.rear==p)
s.rear=s.front;
free(p);
}
5、销毁队列
int destory(LinkQuene &s){
while(s.front){
s.rear=s,front->next;
free(s.front);
s.front=s.rear;
}
if(s.rear==s.front)
return 1;
return 0;
}
6、全部代码
#include
#include
typedef int QElemType;
typedef struct QNode{
QElemType data;
struct QNode *next;
}Qnode,*QuenePtr;
typedef struct{
QuenePtr front;
QuenePtr rear;
}LinkQuene;
void Initquene(LinkQuene &s){
s.front=(QuenePtr)malloc(sizeof(Qnode));
if(!s.front)
exit(-1);
s.rear=s.front;
s.front->next=NULL;
}
void enquene(LinkQuene &s,QElemType e){
QuenePtr p=(QuenePtr)malloc(sizeof(Qnode));
if(!p)
exit(-1);
p->data=e;
p->next=NULL;
s.rear->next=p;
s.rear=p;
}
void dequene(LinkQuene &s,QElemType &e){
if(s.front==s.rear){
printf("出错");
exit(0);
}
QuenePtr p=s.front->next;
e=p->data;
s.front->next=p->next;
if(s.rear==p){
s.rear=s.front;
}
free(p);
}
int Destory(LinkQuene &s){
while(s.front){
s.rear=s.front->next;
free(s.front);
s.front=s.rear;
}
if(s.front==s.rear){
return 1;
}
return 0;
}
void print(LinkQuene s,int n){
QuenePtr p=s.front->next;
while(p!=s.rear){
printf("%d ",p->data);
p=p->next;
}
printf("%d",p->data);
printf("\n");
}
int main(){
LinkQuene s;
Initquene(s);
int n,m,x;
scanf("%d",&n);
for(int i=0;i
哈哈哈,队列的基本东西在这了,有啥建议大家可以提出来。