目录
一、实验目的
- 深入了解栈和队列的基本特性
- 熟练掌握栈的基本操作在两种存储结构上的实现。
- 熟练掌握循环队列的基本操作
- 熟练掌握链队列的基本操作
二、实验要求
排队:输入排队病人的病历号,加入到病人排队队列中
就诊:病人排队队列中的最前面的病人就诊,并将其从队列中删除
查看排队:从队首到队尾列出所有排队病人的病历号
不再排队,余下依次就诊:从队首到队尾列出所有排队病人的病历号,并退出运行
下班:退出运行
三、核心代码
- 输入任意一个十进制整数,用栈实现将其转换为对应的二进制、八进制和十六进制,并打印输出。
-
//十进制转换为二进制 void Convert2(int n) { int x; SqStack *s; InitStack(s); while (n>0) { Push(s,n%2); n= n/2; } while (!EmptyStack(s)) { Pop(s,x); printf("%d",x); } } //十进制转换为八进制 void Convert8(int n) { int x; SqStack *s; InitStack(s); while (n > 0) { Push(s,n%8); n= n/ 8; } while (!EmptyStack(s)) { Pop(s, x); printf("%d", x); } } //十进制转换为十六进制 void Convert16(int n) { int x; SqStack *s; InitStack(s); while (n>0) { Push(s,n%16); n=n/16; }
- 编写病人看病模拟程序(要求模拟病人等待就诊过程,程序采用菜单方式,功能如下)不能重复
-
排队:输入排队病人的病历号,加入到病人排队队列中
就诊:病人排队队列中的最前面的病人就诊,并将其从队列中删除
查看排队:从队首到队尾列出所有排队病人的病历号
不再排队,余下依次就诊:从队首到队尾列出所有排队病人的病历号,并退出运行
下班:退出运行
-
bool Line(SqList *q) { int n,find; Queue* p; bool flag=false; //设置是否关闭程序 Elemtype e; InitQueue(q); printf("======= 选择操作 =======\n"); printf("== 1.排队 ==\n"); printf("== 2.就诊 ==\n"); printf("== 3.查看排队 ==\n"); printf("== 4.不再排队 ==\n"); printf("== 5.下班 ==\n"); while(scanf("%d",&n)) { switch(n) { case 1:printf("请输入您的病历号数字:"); //判断病历号是否重复 do{ scanf("%d",&e); find=0; //设置一个find判断是否有重复的病号 p=q->front; while(p!=NULL&&!find) { if(p->data==e) //如果有重复的数字find值变为1 find=1; else p=p->next; } if(find) printf("\n输入的病号重复,请重新输入:\n"); }while(find==1); enQueue(q,e); printf("\n排队成功!\n"); break; //就诊程序 case 2:if (!QueueEmpty(q)) { deQueue(q,e); printf("就诊成功!\n"); } else printf("当前无人排队!\n"); break; //查看排队程序 case 3:p=q->front; printf("排在您前面的人有:\n"); while (p) { printf("%d\n",p->data); p=p->next; } if(QueueEmpty(q)) //如果前方没有人排队,则输出“无人” { printf("无人!\n"); } break; //不再排队程序 case 4:p=q->front; printf("排在您前面的人有:\n"); while (p) { printf("%d\n",p->data); p = p->next; } flag=true; break; case 5:flag=true; break; default:printf("指令错误,重新输入!\n"); } if (flag) break; printf("======= 选择操作 =======\n"); printf("== 1.排队 ==\n"); printf("== 2.就诊 ==\n"); printf("== 3.查看排队 ==\n"); printf("== 4.不再排队 ==\n"); printf("== 5.下班 ==\n"); } return true; } int main() { SqList *q=NULL; bool flag=Line(q); if (flag) printf("谢谢使用,再见。\n"); return 0; }
四、实验记录
1.转换进制的代码运行结果截图
2. 病人看病模拟程序
①排队功能:输入排队病人的病历号,重复的病历号会显示错误
②就诊功能:最前面的病人就诊,并将其删除
输入病历号123、124、125、126,实现一次就诊功能后的病历号如下图所示,删除了123号
③查看排队功能:队首到队尾列出所有排队病人的病历号
④不再排队,余下依次就诊:从队首到队尾列出所有排队病人的病历号,并退出运行
⑤下班:退出运行
五、总结
在编写病人看病程序时,代码要求病号不能重复,所以我在输入病历号数字的操作之中,加入了一个do…while循环,设立find变量,先遍历队列中以及存在的病号数字,若有重复,则find的值从0变为1,最终返回find的值来判断输入的病号是否重复,如果重复则需要重新输入病号。
六、完整报告和成果文件提取链接
完整可运行代码以及相关实验报告以下链接可获取:
链接:https://pan.baidu.com/s/1DuGfYm6_KDm04gUKWFSSVQ?pwd=lw6u
提取码:lw6u