- 结构体定义
- 基础操作
- 例题
结构体定义
typedef struct{
int data[MaxSize];
int front,rear;
}SqQueue;
基础操作
1.初始化队列
void InitQu(SqQueue &Q){
Q.front=Q.rear=0;
}
2.判断是否为空
bool isEmpty(SqQueue Q){
if(Q.front==Q.rear){//队满应该是 (Q.rear+1)%MaxSize==Q.front
return 1;
}else{
return 0;
}
}
3.入队
bool enQue(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;
}
4.出队
bool DeQue(SqQueue &Q,int &x){
if(Q.front==Q.rear) return 0;
x=Q.data[Q.front];
Q.front=(Q.front+1)%MaxSize;
return 1;
}
5.读队头元素
bool getHead(SqQueue Q,int &x){
if(Q.front==Q.rear) return 0;
x=Q.data[Q.front];
return 1;
}
例题
1.假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针,请写出对应入队出队算法
void enQue1(LNode *&rear,int x){
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data=x;
s->next=rear->next;
rear->next=s;
rear=s;
}
bool DeQue1(LNode *&rear,int x){
LNode *s;
if(rear->next==rear) return 0;
else{
s=rear->next->next;
rear->next->next=s->next;
x=s->data;
if(s==rear) rear=rear->next;
free(s);
return 1;
}
}
2.如果允许在循环队列的两端进行插入和删除操作,要求:写出循环队列的类型定义,分别写出队尾删除和对头插入的算法(和正常的出队入队有稍微出入)
typedef struct{
int data[MaxSize];
int front,rear;
}cyQueue;
bool deQue2(cyQueue &Q,int &x){
if(Q.front==Q.rear) return 0;
else{
x=Q.data[Q.rear];
Q.rear=(Q.rear-1)%MaxSize;
return 1;
}
}
bool enQue2(cyQueue &Q,int x){
if(Q.rear==(Q.front-1+MaxSize)%MaxSize) return 0;
else{
Q.data[Q.front]==x;
Q.front=(Q.front-1+MaxSize)%MaxSize;
return 1;
}
}
3.设计一个循环队列,用front和rear作为对头和队尾指针,另外用一个tag标志表示队列是否为空,当tag=0为空,为1不空这样当rear=front时队满,请设计出结构和相关出队如对算法(标签,每次出队设置tag为0,入队设置为1,队空时tag=0,Q.front=Q.rear,队满时:Q.front=Q.rear)
typedef struct{
int data[MaxSize];
int front,rear;
int tag;
}cyQuetag;
void InitCQ(cyQuetag &Q){
Q.tag=0;
Q.front=Q.rear=0;
}
bool isEmpt(cyQuetag Q){
if(Q.front==Q.rear&&Q.tag==0) return 1;
else{
return 0;
}
}
bool isFull(cyQuetag Q){
if(Q.front==Q.rear&&Q.tag==1) return 1;
else{
return 0;
}
}
bool enCq(cyQuetag &Q,int x){
if(isFull(Q)) return 0;
else{
Q.rear=(Q.rear+1)%MaxSize;
Q.data[Q.rear]=x;
Q.tag=1;
return 1;
}
}
bool deCq(cyQuetag &Q,int &x){
if(isEmpt(Q)) return 0;
else{
x=Q.data[Q.front];
Q.front=(Q.front+1)%MaxSize;
Q.tag=0;
return 1;
}
}