实验五 队列的应用(参考答案)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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*/

}

}

相关文档
最新文档