队列的顺序存储(C语言)
循环队列
rear指向队尾后一个元素
1.区分队空和队满采用牺牲一个存储单元
类型定义
#define MaxSize 50
typedef int ElemType;
typedef struct{
ElemType data[MaxSize];
int front, rear;
}SqQueue;
初始化
void InitQueue(SqQueue Q){
Q.front=Q.rear=0;
}
判空
int QueueEmpty(SqQueue Q){
if(Q.rear==Q.front)
return 1;
else
return 0;
}
入队
int EnQueue(SqQueue *Q,int x){
if(((*Q).rear+1)%MaxSize==(*Q).front)
return 0;
(*Q).data[(*Q).rear]=x;
(*Q).rear=((*Q).rear+1)%MaxSize;
return 1;
}
出队
int DeQueue(SqQueue *Q,int *x){
if((*Q).rear==(*Q).front)
return 0;
*x=(*Q).data[(*Q).front];
(*Q).front=((*Q).front+1)%MaxSize;
return 1;
}
取队头元素
int GetHead(SqQueue Q,int *x){
if(Q.rear==Q.front)
return 0;
*x=Q.data[Q.front];
return 1;
}
2.区分队空和队满采用增加表示元素个数的数据成员
类型定义
#define MaxSize 50
typedef int ElemType;
typedef struct{
ElemType data[MaxSize];
int front, rear;
int size;
}SqQueue;
初始化
void InitQueue(SqQueue Q){
Q.front=Q.rear=0;
Q.size=0;
}
判空
int QueueEmpty(SqQueue Q){
if(Q.size==0)
return 1;
else
return 0;
}
入队
int EnQueue(SqQueue *Q,int x){
if(((*Q).size==MaxSize)
return 0;
(*Q).data[(*Q).rear]=x;
(*Q).rear=((*Q).rear+1)%MaxSize;
(*Q).size++;
return 1;
}
出队
int DeQueue(SqQueue *Q,int *x){
if((*Q).size==0)
return 0;
*x=(*Q).data[(*Q).front];
(*Q).front=((*Q).front+1)%MaxSize;
(*Q).size--;
return 1;
}
取队头元素
int GetHead(SqQueue Q,int *x){
if(Q.size==0)
return 0;
*x=Q.data[Q.front];
return 1;
}
3.区分队空队满采用增设tag数据成员
类型定义
#define MaxSize 50
typedef int ElemType;
typedef struct{
ElemType data[MaxSize];
int front, rear;
int tag;
}SqQueue;
初始化
void InitQueue(SqQueue Q){
Q.front=Q.rear=0;
Q.tag=0;
}
判空
int QueueEmpty(SqQueue Q){
if(Q.front==Q.rear&&Q.tag==0)
return 1;
else
return 0;
}
入队
int EnQueue(SqQueue *Q,int x){
if((*Q).front==(*Q).rear&&(*Q).tag==1)
return 0;
(*Q).data[(*Q).rear]=x;
(*Q).rear=((*Q).rear+1)%MaxSize;
(*Q).tag=1;
return 1;
}
出队
int DeQueue(SqQueue *Q,int *x){
if((*Q).front==(*Q).rear&&(*Q).tag==0)
return 0;
*x=(*Q).data[(*Q).front];
(*Q).front=((*Q).front+1)%MaxSize;
(*Q).tag=0;
return 1;
}
取队头元素
int GetHead(SqQueue Q,int *x){
if((*Q).front==(*Q).rear&&(*Q).tag==0)
return 0;
*x=Q.data[Q.front];
return 1;
}
rear指向队尾元素
1.区分对空队满采用牺牲一个存储单元
类型定义
#define MaxSize 50
typedef int ElemType;
typedef struct{
ElemType data[MaxSize];
int front, rear;
}SqQueue;
初始化
void InitQueue(SqQueue Q){
Q.front=0;
Q.rear=MaxSize-1;
}
判空
int QueueEmpty(SqQueue Q){
if((Q.rear+1)%MaxSize==Q.front)
return 1;
else
return 0;
}
入队
int EnQueue(SqQueue *Q,int x){
if(((*Q).rear+2)%MaxSize==(*Q).front)
return 0;
(*Q).rear=((*Q).rear+1)%MaxSize;
(*Q).data[(*Q).rear]=x;
return 1;
}
出队
int DeQueue(SqQueue *Q,int *x){
if((*Q).rear==(*Q).front)
return 0;
*x=(*Q).data[(*Q).front];
(*Q).front=((*Q).front+1)%MaxSize;
return 1;
}
取队头元素
int GetHead(SqQueue Q,int *x){
if((Q.rear+1)%MaxSize==Q.front)
return 0;
*x=Q.data[Q.front];
return 1;
}
2.区分队空和队满采用增加表示元素个数的数据成员
类型定义
#define MaxSize 50
typedef int ElemType;
typedef struct{
ElemType data[MaxSize];
int front, rear;
int size;
}SqQueue;
初始化
void InitQueue(SqQueue Q){
Q.front=0;
Q.rear=MaxSize-1;
Q.size=0;
}
判空
int QueueEmpty(SqQueue Q){
if(Q.size==0)
return 1;
else
return 0;
}
入队
int EnQueue(SqQueue *Q,int x){
if(((*Q).size==MaxSize)
return 0;
(*Q).rear=((*Q).rear+1)%MaxSize;
(*Q).data[(*Q).rear]=x;
(*Q).size++;
return 1;
}
出队
int DeQueue(SqQueue *Q,int *x){
if((*Q).size==0)
return 0;
*x=(*Q).data[(*Q).front];
(*Q).front=((*Q).front+1)%MaxSize;
(*Q).size--;
return 1;
}
取队头元素
int GetHead(SqQueue Q,int *x){
if(Q.size==0)
return 0;
*x=Q.data[Q.front];
return 1;
}
3.区分队空队满采用增设tag数据成员
类型定义
#define MaxSize 50
typedef int ElemType;
typedef struct{
ElemType data[MaxSize];
int front, rear;
int tag;
}SqQueue;
初始化
void InitQueue(SqQueue Q){
Q.front=0;
Q.rear=MaxSize-1;
Q.tag=0;
}
判空
int QueueEmpty(SqQueue Q){
if(Q.front==Q.rear&&Q.tag==0)
return 1;
else
return 0;
}
入队
int EnQueue(SqQueue *Q,int x){
if((*Q).front==(*Q).rear&&(*Q).tag==1)
return 0;
(*Q).rear=(*Q).rear+1;
(*Q).data[(*Q).rear]=x;
(*Q).tag=1;
return 1;
}
出队
int DeQueue(SqQueue *Q,int *x){
if((*Q).front==(*Q).rear&&(*Q).tag==0)
return 0;
*x=(*Q).data[(*Q).front];
(*Q).front=((*Q).front+1)%MaxSize;
(*Q).tag=0;
return 1;
}
取队头元素
int GetHead(SqQueue Q,int *x){
if((*Q).front==((*Q).rear+1)%MaxSize&&(*Q).tag==0)
return 0;
*x=Q.data[Q.front];
return 1;
}