先附上C++下的代码
1 #include <iostream> 2 #include<malloc.h> 3 #define MAXSIZE 100 4 5 using namespace std; 6 7 typedef struct{ 8 int *base; 9 int front; 10 int rear; 11 }SqQueue; 12 int InitQueue(SqQueue &Q,int n){//初始化队列 13 int i; 14 Q.base = (int *)malloc(MAXSIZE * sizeof(int)); 15 if(!Q.base) exit(-1); 16 Q.front=0; 17 Q.rear=0; 18 if(n==0)return -1; 19 for(i=0;i<n;i++){ 20 cin>>Q.base[i]; 21 Q.rear++; 22 } 23 return 0; 24 } 25 26 int EnQueue(SqQueue &Q, int e){//入队 27 if((Q.rear+1)%MAXSIZE==Q.front) exit(-1); 28 Q.base[Q.rear]=e; 29 Q.rear=(Q.rear+1)%MAXSIZE; 30 return 0; 31 } 32 33 int OutQueue(SqQueue &Q,int &e){//出队 34 if(Q.front==Q.rear) exit(-1); 35 e=Q.base[Q.front]; 36 Q.front=(Q.front+1)%MAXSIZE; 37 return 0; 38 } 39 40 int OutputQueue(SqQueue Q){//输出队列中的元素 41 if(Q.front==Q.rear) exit(-1); 42 int p; 43 p=Q.front; 44 while(p!=Q.rear){ 45 cout<<Q.base[p]<<endl; 46 p=(p+1)%MAXSIZE; 47 } 48 return 0; 49 }
循环队列中最难也是最妙的操作就是,将实际线性的顺序存储空间以代码实现令人产生幻觉(其实就是人类自己想像)的循环队列的效果......
通过一个求余队列长度(%MAXSIZE),达到了每次超过队列长度就循环至队头开始赋值,直至队列已满,同时舍弃一个空间来判断队列是否为满。
本文rear是指向尾号元素的下一位,当(Q.rear+1)%MAXSIZE=Q.front时,队满。