运用知识:
循环队列的顺序存储
下面是文件运行成功的样式展示
1 #include<stdio.h> 2 #include<stdlib.h> 3 #define FALSE 0 4 #define ERROR 0 5 #define OK 1 6 #define TRUE 1 7 #define MAXSIZE 6 //队列的长度 8 typedef int Elem; 9 typedef int Status; 10 /* 11 这里似乎没用到GetHead(),QueueEmpty()这两个函数,但是我还是定义了 12 */ 13 //队列的顺序存储结构 14 typedef struct 15 { 16 Elem data[MAXSIZE]; 17 int front; 18 int rear; 19 }Sq; 20 21 int IsInit = FALSE;//这个是用来判断是否初始化,即主函数中用来要求先输入0(即先选上班,不然队列没有初始化); 22 //队列的初始化,即将队列的头尾指针都等于0; 23 void Init(Sq &S) 24 { 25 S.front = 0; 26 S.rear = 0; 27 IsInit = TRUE; 28 } 29 //入队列,注:入队列时会空出一个数组位置,方便尾指针的指向,所以这也是判断队满时为什么尾指针要加1 30 Status EnQueue(Sq &S,Elem num) 31 { 32 if((S.rear+1)%MAXSIZE==S.front) return ERROR;//判断是否栈满,即尾指针后移一位与头指针相逢,队列就满了 33 S.data[S.rear] = num; //存数 34 S.rear = (S.rear+1)%MAXSIZE; //队尾指针后移 35 return OK; 36 } 37 //出队列 38 Status DeQueue(Sq &S,Elem &e) 39 { 40 if(S.front == S.rear) return ERROR;//判断队空,当队头指针遇到队尾指针,队空 41 e = S.data[S.front]; //队头元素赋值给e 42 S.front = (S.front+1)%MAXSIZE;//队头指针后移 43 return OK; 44 } 45 //获得队列的长度 46 int getLen(Sq S) 47 { 48 return (S.rear+MAXSIZE-S.front)%MAXSIZE;//返回队列的长度 49 } 50 //获得队列的头元素 51 Status GetHead(Sq S,Elem &e) 52 { 53 if(S.rear == S.front) 54 return ERROR; 55 else{ 56 e = S.data[S.front]; 57 return OK; 58 } 59 } 60 //判断队空 61 Status QueueEmpty(Sq S) 62 { 63 if(S.front==S.rear) return ERROR; 64 else 65 return OK; 66 } 67 //判断队满 68 Status QueueFull(Sq S) 69 { 70 if((S.rear+1)%MAXSIZE==S.front) 71 return ERROR; 72 else 73 return OK; 74 } 75 int main() 76 { 77 Sq S; 78 int n,num=0; 79 Elem e; 80 81 while(1) 82 { 83 printf("---------------银行叫号系统-----------\n"); 84 printf("--------------------------------------\n"); 85 printf("1.上班\n"); 86 printf("2.排号\n"); 87 printf("3.叫号\n"); 88 printf("0.下班\n"); 89 printf("---------------------------------------\n\n"); 90 91 scanf("%d",&n); 92 switch(n) 93 { 94 case 0:if(!IsInit) 95 { 96 printf("要先开始上班才能下班哦!!\n\n"); 97 break; 98 //为什么要有这个判断呢,因为队列要初始化,这里其实可以不做判断 99 } 100 if(!QueueEmpty(S)) 101 { 102 printf("下班啦,可以回家了!!!\n\n"); 103 return 0; 104 }else 105 { 106 printf("还有业务没有完成,暂时不能下班!!\n\n"); 107 break; 108 } 109 case 1: 110 Init(S); 111 num = 0; 112 printf("一切准备就绪,开始上班!!!\n\n"); 113 break; 114 115 case 2: 116 if(!IsInit) 117 { 118 printf("要先开始上班,请做好工作准备!!\n\n"); 119 break; 120 //为什么要有这个判断呢,因为队列要初始化 121 } 122 if(QueueFull(S)) 123 { 124 //如果队列没满,就入队列 125 EnQueue(S,++num); 126 printf("当前是%d号,前面有%d位\n\n",num,getLen(S)-1); 127 break; 128 }else 129 { 130 //如果队列满了 131 printf("人已满了!!请耐心等待\n\n"); 132 break; 133 } 134 case 3: 135 if(!IsInit) 136 { 137 printf("新的一天开始了\n要先开始上班,请先做好准备!!\n\n"); 138 break; 139 //为什么要有这个判断呢,因为队列要初始化 140 } 141 if(DeQueue(S,e)) 142 { 143 //如果队列没空,就可以出队列 144 printf("%d号业务办理成功!还有%d人在等待!\n\n",e,getLen(S)); 145 break; 146 }else 147 { 148 //如果队列空了 149 printf("当前没有人办理业务!!\n\n"); 150 break; 151 } 152 default : 153 printf("无效操作!!!请重新输入\n\n"); 154 break; 155 156 } 157 } 158 }