实验五 队列的应用(参考答案)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五、队列的应用
一、实验原理:
一种“先进先出”(FIFO---First In First Out)的数据结构:即插入在队尾一端进行,而删除在队头进行。
键盘缓冲区问题:
设计算法实现模拟键盘缓冲区问题。假设有两个进程同时存在于一个应用程序之中,第一个进程连续在屏幕上显示字符“X”,第二个进程不断检查键盘上是否有输入,若有则读入用户键入的字符,将其保存到键盘缓冲区之中。程序约定当用户键入一个逗号“,”,则表示第一进程结束,系统开始显示那些在键盘缓冲区中的字符;接着继续执行第一个进程,即,在屏幕上显示字符“X”;当用户输入“;”的时候,刚结束整个程序。
算法提示:为了充分利用缓冲区的空间往往将缓冲区设计成循环队列的结构,并为循环队列结构的缓冲区设置一个队首指针和一个队尾指针。每输入法一个字符到缓冲区中,就将尾指针后移,链入缓冲区的循环队列之中;每输出一个字符号,就将队头指针前移,将它从缓冲队列中删除。
参考代码:
/*键盘缓冲区问题*/
#define MAXSIZE 20
#define TRUE 1
#define FALSE 0
#include "stdio.h"
#include "conio.h"
#include "dos.h"
typedef char elemtype;
typedef struct
{
elemtype elem[MAXSIZE];
int front, rear;
}queuetype;
int enque(queuetype *s, elemtype x) /*数据入队列*/
{
if (( s->rear+1)%MAXSIZE==s->front ) /*队列已满*/
return (FALSE);
else
{
s->rear=(s->rear+1) % MAXSIZE;
s->elem[s->rear]=x;
return(true);
}
}
elemtype delqueue (queuetype *s ) /*数据出队列*/
{
if (s-front==s->rear) /*队列为空*/
return(NULL);
else /*队列非空*/
{
s->front=(s->front+1)%MAXSIZE;
return(s->elem[s->front]);
}
}
main()
{
char ch1,ch2;
queuetype *p;
int t,f;
p=(queuetype *)malloc(sizeof(queuetype));
p->front=0;
p->rear=0;
while(1) /*开始交替执行*/
{
while(1) /*第一个进程的执行*/
{
if(kbhit()) /*检测是否有键盘输入*/
{
ch1=bdos(7,0,0); /*中断调用,键入字符存入ch1*/
f=enqueue( p, ch1 ); /*字符入循环队列*/
if ( f== FALSE )
{
printf(" The queue is already full !\n");
break;
}
}
if ( ch1==';' || ch1==',' )
break; /*第一个进程正常结束情况*/
printf("X"); /*执行第一个进程*/
}
ch2=delqueue(p);
while( ch2 != NULL )
{
putchar(ch2); /*在屏幕上显示输入缓冲区中的内容*/
ch2=delqueue(p); /*字符出队列*/
}
getchar(); /*为看清屏幕内容, 在此暂停, 按回车继续
if (ch1==';'||f==FALSE) /*程序结束*/
break;
else /*继续执行*/
ch1=''; /*先置空ch1*/
}
}