利用标志位tag实现顺序循环队列:
1 /* */ 2 # include <stdio.h> 3 # include <math.h> 4 # include <stdlib.h> 5 # define QUEUESIZE 100 6 # define MAXSIZE 100 7 typedef int DataType; 8 9 typedef struct 10 { 11 int queue[QUEUESIZE]; 12 int front, rear; 13 int tag; 14 }SCQueue; 15 16 void PrintData( DataType e); 17 int CheckType(DataType e); 18 void InitQueue(SCQueue *SCQ)///初始化为空队列 19 { 20 SCQ->front = SCQ->rear = 0;///对头指针和队尾指针都置为0 21 SCQ->tag = 0;///标志置为0; 22 } 23 24 int QueueEmpty(SCQueue SCQ)///判断顺序循环队列是否为空,是则返回1,否则返回0 25 { 26 if( SCQ.front==SCQ.rear && SCQ.tag==0 )///队头指针和队尾指针都为0,且标志位为0表示队列已空 27 { 28 return 1; 29 } 30 else 31 { 32 return 0; 33 } 34 } 35 36 int EnQueue(SCQueue *SCQ, DataType e)///将元素e插入顺序循环队列SQ中, 插入成功返回1, 否则返回0 37 { 38 if( SCQ->front==SCQ->rear && SCQ->tag==1 ) 39 { 40 printf("顺序循环队列已满, 不能如队!"); 41 return 0; 42 } 43 else 44 { 45 SCQ->queue[SCQ->rear] = e; 46 SCQ->rear = SCQ -> rear + 1; 47 SCQ->tag = 1; 48 return 1; 49 } 50 } 51 52 int DeQueue(SCQueue *SCQ, DataType *e)///删除循环队列中的队头元素, 并将该元素赋值给e, 删除成功返回1, 否则返回0 53 { 54 if( QueueEmpty(*SCQ) ) 55 { 56 printf("顺序循环队列已经是空列, 不能再进行出队操作!"); 57 return 0; 58 } 59 else 60 { 61 *e = SCQ->queue[SCQ->front]; 62 SCQ->front = SCQ->front+1; 63 SCQ->tag = 0; 64 return 1; 65 } 66 } 67 68 void DisplayQueue(SCQueue SCQ)///输出顺序循环队列中的元素 69 { 70 int i; 71 if( QueueEmpty(SCQ) ) 72 { 73 return ; 74 } 75 if( SCQ.front<SCQ.rear ) 76 { 77 for( i=SCQ.front; i<SCQ.rear; i++) 78 { 79 printf("%4d", SCQ.queue[i]); 80 } 81 } 82 else 83 { 84 for( i=SCQ.front; i<SCQ.rear+QUEUESIZE; i++ ) 85 { 86 printf("%4d", SCQ.queue[i%QUEUESIZE]); 87 } 88 } 89 printf(" "); 90 return ; 91 } 92 93 int main() 94 { 95 SCQueue Q; 96 int e; 97 int a[] = {1, 2, 3, 4}, i; 98 InitQueue(&Q); 99 for( i=0; i<sizeof(a)/sizeof(a[0]); i++ ) 100 { 101 EnQueue(&Q, a[i]); 102 } 103 printf("队列中元素: "); 104 DisplayQueue(Q); 105 i= 0; 106 while( !QueueEmpty(Q) ) 107 { 108 printf("队头元素第%d次出队 ", ++i); 109 DeQueue(&Q, &e); 110 printf("出队的元素: "); 111 printf("%d ", e); 112 } 113 } 114 115 void PrintData(DataType e)///数据的输出(为了使调用函数不需要格式控制符 116 { 117 char n; 118 n = CheckType(e); 119 switch(n) 120 { 121 case 1: 122 printf("%4c ", e); 123 break; 124 case 2: 125 printf("%4d ", e); 126 break; 127 case 3: 128 printf("%8.2f ", e); 129 break; 130 } 131 } 132 133 int CheckType(DataType e)///判断e是浮点数,整数还是字母字符 134 { 135 char str[MAXSIZE]; 136 int a; 137 float b; 138 if( fabs(e-(int)e>1e-6))///是浮点数 139 { 140 return 3; 141 } 142 if( e>='A' && e<='Z' || e>='a' && e<='z' )///是字母字符 143 { 144 return 1; 145 } 146 else///是整数 147 { 148 return 2; 149 } 150 }