一、定义队尾指针指向队尾元素下一个位置 方案一(牺牲1个空间):
/***判断队满条件:队尾指针的再下一个位置是队头****/ /***即:(Q.rear+1)%Maxsize == Q.front。***********/ /***代价:牺牲一个存储单元.***********************/ #include<stdio.h> /*队列定义*/ #define Maxsize 10 typedef struct{ int data[Maxsize]; //静态数组存放队列元素 int front,rear; //队头指针和队尾指针 }SqQueue; /*初始化队列*/ void InitQueue(SqQueue &Q){ Q.front = Q.rear; //初始时,队头队尾指针指向0 } /*入队操作*/ bool EnQueue(SqQueue &Q, int x){ if((Q.rear+1)%Maxsize == Q.front) //队满则报错 return false; Q.data[Q.rear] = x; //新元素插入队尾 Q.rear = (Q.rear+1)%Maxsize; //队尾指针加一取模 return true; } /*出队操作*/ bool DeQueue(SqQueue &Q, int &x){ if(Q.rear == Q.front) //队空则报错 return false; x = Q.data[Q.front]; Q.front = (Q.front+1)%Maxsize; //队头指针后移 return true; } /*获取队头元素的值,用x返回*/ bool GetHead(SqQueue Q, int &x){ if(Q.rear == Q.front) //队空则报错 return false; x = Q.data[Q.front]; return true; } int main(){ int ret; //用来获取返回值 SqQueue Q; InitQueue(Q); EnQueue(Q,1); EnQueue(Q,2); EnQueue(Q,3); GetHead(Q,ret); printf("QueueHead is:%d\n"); DeQueue(Q,ret); GetHead(Q,ret); printf("QueueHead is:%d\n"); return 0; }方案二(size):
/***判断队满方法:用size记录当前队列长度****/ /***即:Q.size == Maxsize表示队满************/ #include<stdio.h> /*队列定义*/ #define Maxsize 10 typedef struct{ int data[Maxsize]; //静态数组存放队列元素 int front,rear; //队头指针和队尾指针 int size; //队列当前长度 }SqQueue; /*初始化队列*/ void InitQueue(SqQueue &Q){ Q.front = Q.rear; //初始时,队头队尾指针指向0 Q.size = 0; } /*入队操作*/ bool EnQueue(SqQueue &Q, int x){ if(Q.size == Maxsize) //队满则报错 return false; Q.data[Q.rear] = x; //新元素插入队尾 Q.rear = (Q.rear+1)%Maxsize; //队尾指针加一取模 Q.size++; return true; } /*出队操作*/ bool DeQueue(SqQueue &Q, int &x){ if(Q.size == 0) //队空则报错 return false; x = Q.data[Q.front]; Q.front = (Q.front+1)%Maxsize; //队头指针后移 Q.size--; return true; } /*获取队头元素的值,用x返回*/ bool GetHead(SqQueue Q, int &x){ if(Q.size == 0) //队空则报错 return false; x = Q.data[Q.front]; return true; } int main(){ int ret; //用来获取返回值 SqQueue Q; InitQueue(Q); EnQueue(Q,1); EnQueue(Q,2); EnQueue(Q,3); GetHead(Q,ret); printf("QueueHead is:%d\n"); DeQueue(Q,ret); GetHead(Q,ret); printf("QueueHead is:%d\n"); return 0; }方案三(tag):
/***判断队满方法:用tag记录当前的插入(tag=1)和删除(tag=0)操作****/ /********即:(Q.front == Q.rear && tag == 1)表示队满************/ #include<stdio.h> /*队列定义*/ #define Maxsize 10 typedef struct{ int data[Maxsize]; //静态数组存放队列元素 int front,rear; //队头指针和队尾指针 int tag; //队列当前操作 }SqQueue; /*初始化队列*/ void InitQueue(SqQueue &Q){ Q.front = Q.rear; //初始时,队头队尾指针指向0 Q.tag = 0; } /*入队操作*/ bool EnQueue(SqQueue &Q, int x){ if(Q.front == Q.rear && Q.tag == 1) //队满则报错 return false; Q.data[Q.rear] = x; //新元素插入队尾 Q.rear = (Q.rear+1)%Maxsize; //队尾指针加一取模 Q.tag = 1; return true; } /*出队操作*/ bool DeQueue(SqQueue &Q, int &x){ if(Q.front == Q.rear && Q.tag == 0) //队空则报错 return false; x = Q.data[Q.front]; Q.front = (Q.front+1)%Maxsize; //队头指针后移 Q.tag = 0; return true; } /*获取队头元素的值,用x返回*/ bool GetHead(SqQueue Q, int &x){ if(Q.front == Q.rear && Q.tag == 0) //队空则报错 return false; x = Q.data[Q.front]; return true; } int main(){ int ret; //用来获取返回值 SqQueue Q; InitQueue(Q); EnQueue(Q,1); EnQueue(Q,2); EnQueue(Q,3); GetHead(Q,ret); printf("QueueHead is:%d\n"); DeQueue(Q,ret); GetHead(Q,ret); printf("QueueHead is:%d\n"); return 0; }二、定义队尾指针指向队尾元素 方案一(牺牲1个空间):
/***判断队满条件:队尾指针的再下一个位置是队头****/ /***即:(Q.rear+1)%Maxsize == Q.front。***********/ /***代价:牺牲一个存储单元.***********************/ #include<stdio.h> /*队列定义*/ #define Maxsize 10 typedef struct{ int data[Maxsize]; //静态数组存放队列元素 int front,rear; //队头指针和队尾指针 }SqQueue; /*初始化队列*/ void InitQueue(SqQueue &Q){ Q.front = 0; //初始时,队头指针指向0 Q.rear = Maxsize-1;//初始时,队尾指针指向Maxsize-1 } /*入队操作*/ bool EnQueue(SqQueue &Q, int x){ if((Q.rear+2)%Maxsize == Q.front) //队满则报错 return false; Q.rear = (Q.rear+1)%Maxsize; Q.data[Q.rear] = x; //队尾指针加一取模,再插入新元素 return true; } /*出队操作*/ bool DeQueue(SqQueue &Q, int &x){ if((Q.rear+1)%Maxsize == Q.front) //队空则报错 return false; x = Q.data[Q.front]; Q.front = (Q.front+1)%Maxsize; //队头指针后移 return true; } /*获取队头元素的值,用x返回*/ bool GetHead(SqQueue Q, int &x){ if((Q.rear+1)%Maxsize == Q.front) //队空则报错 return false; x = Q.data[Q.front]; return true; } int main(){ int ret; //用来获取返回值 SqQueue Q; InitQueue(Q); EnQueue(Q,1); EnQueue(Q,5); GetHead(Q,ret); printf("QueueHead is:%d\n",ret); DeQueue(Q,ret); GetHead(Q,ret); printf("QueueHead is:%d\n",ret); return 0; }方案二(size):
/***判断队满方法:用size记录当前队列长度****/ /***即:Q.size == Maxsize表示队满************/ #include<stdio.h> /*队列定义*/ #define Maxsize 10 typedef struct{ int data[Maxsize]; //静态数组存放队列元素 int front,rear; //队头指针和队尾指针 int size; //队列当前长度 }SqQueue; /*初始化队列*/ void InitQueue(SqQueue &Q){ Q.front = 0; //初始时,队头指针指向0 Q.rear = Maxsize-1;//初始时,队头指针指向Maxsize-1 Q.size = 0; } /*入队操作*/ bool EnQueue(SqQueue &Q, int x){ if(Q.size == Maxsize) //队满则报错 return false; Q.rear = (Q.rear+1)%Maxsize; //队尾指针加一取模,再将新元素插入队尾 Q.data[Q.rear] = x; Q.size++; return true; } /*出队操作*/ bool DeQueue(SqQueue &Q, int &x){ if(Q.size == 0) //队空则报错 return false; x = Q.data[Q.front]; Q.front = (Q.front+1)%Maxsize; //队头指针后移 Q.size--; return true; } /*获取队头元素的值,用x返回*/ bool GetHead(SqQueue Q, int &x){ if(Q.size == 0) //队空则报错 return false; x = Q.data[Q.front]; return true; } int main(){ int ret; //用来获取返回值 SqQueue Q; InitQueue(Q); EnQueue(Q,1); EnQueue(Q,2); EnQueue(Q,3); GetHead(Q,ret); printf("QueueHead is:%d\n"); DeQueue(Q,ret); GetHead(Q,ret); printf("QueueHead is:%d\n"); return 0; }方案三(tag):
/***判断队满方法:用tag记录当前的插入(tag=1)和删除(tag=0)操作****/ /********即:(Q.front == Q.rear && tag == 1)表示队满************/ #include<stdio.h> /*队列定义*/ #define Maxsize 10 typedef struct{ int data[Maxsize]; //静态数组存放队列元素 int front,rear; //队头指针和队尾指针 int tag; //队列当前操作 }SqQueue; /*初始化队列*/ void InitQueue(SqQueue &Q){ Q.front = 0; //初始时队头指针指向0 Q.rear = Maxsize-1;//初始时队尾指针指向Maxsize-1 Q.tag = 0; } /*入队操作*/ bool EnQueue(SqQueue &Q, int x){ if(Q.front == (Q.rear+1)%Maxsize && Q.tag == 1) //队满则报错 return false; Q.rear = (Q.rear+1)%Maxsize; //队尾指针加一取模 Q.data[Q.rear] = x; //新元素插入队尾 Q.tag = 1; return true; } /*出队操作*/ bool DeQueue(SqQueue &Q, int &x){ if(Q.front == (Q.rear+1)%Maxsize && Q.tag == 0) //队空则报错 return false; x = Q.data[Q.front]; Q.front = (Q.front+1)%Maxsize; //队头指针后移 Q.tag = 0; return true; } /*获取队头元素的值,用x返回*/ bool GetHead(SqQueue Q, int &x){ if(Q.front == Q.rear && Q.tag == 0) //队空则报错 return false; x = Q.data[Q.front]; return true; } int main(){ int ret; //用来获取返回值 SqQueue Q; InitQueue(Q); EnQueue(Q,1); EnQueue(Q,2); EnQueue(Q,3); GetHead(Q,ret); printf("QueueHead is:%d\n"); DeQueue(Q,ret); GetHead(Q,ret); printf("QueueHead is:%d\n"); return 0; }