运用知识:

     循环队列的顺序存储

下面是文件运行成功的样式展示

  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 }
01-03 11:10