【数据结构】实验:栈和队列的操作及其应用

目录

一、实验目的

二、实验要求

三、核心代码

四、实验记录

五、总结

六、完整报告和成果文件提取链接


一、实验目的

  • 深入了解栈和队列的基本特性
  • 熟练掌握栈的基本操作在两种存储结构上的实现。
  • 熟练掌握循环队列的基本操作
  • 熟练掌握链队列的基本操作

二、实验要求

  • 输入任意一个十进制整数,用栈实现将其转换为对应的二进制、八进制和十六进制,并打印输出。
  • 编写病人看病模拟程序(要求模拟病人等待就诊过程,程序采用菜单方式,功能如下)不能重复

排队:输入排队病人的病历号,加入到病人排队队列中

就诊:病人排队队列中的最前面的病人就诊,并将其从队列中删除

查看排队:从队首到队尾列出所有排队病人的病历号

不再排队,余下依次就诊:从队首到队尾列出所有排队病人的病历号,并退出运行

下班:退出运行

三、核心代码

  • 输入任意一个十进制整数,用栈实现将其转换为对应的二进制、八进制和十六进制,并打印输出。
  • //十进制转换为二进制
    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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值