C#数据结构:队列应用:键盘输入循环缓冲区问题
在操作系统中,循环队列经常用于实时应用程序。例如,当程序正在执行其他任务时,用户可以从键盘上不断键入所要输入的内容。系统在利用这种分时处理方法时,用户键入的内容不能在屏幕上立刻显示出来,直到当前正在工作的那个进程结束为止。但在这个进程执行时,系统是在不断地检查键盘状态,如果检测到用户键入了一个新的字符,就立刻把它存到系统缓冲区中,然后继续运行原来的进程。当当前工作的进程结束后,系统就从缓冲区中取出键入的字符,并按要求进行处理。这里的键盘输入缓冲区采用了循环队列。队列的特性保证了输入字符先键入、先保存、先处理的要求,循环结构又有效地限制了缓冲区的大小,并避免了假溢出问题。
【问题描述】:有两个进程同时存在于一个程序中。其中第一个进程在屏幕上连续显示字符
“A”,与此同时,程序不断检测键盘是否有输入,如果有的话,就读入用户键入的字符并
保存到输入缓冲区中。在用户输入时,键入的字符并不立即回显在屏幕上。当用户键入一个
逗号(,)或分号(;)时,表示第一个进程结束,第二个进程从缓冲区中读取那些已键入的字
符并显示在屏幕上。第二个进程结束后,程序又进入第一个进程,重新显示字符“A”,同
时用户又可以继续键入字符,直到用户输入一个分号(;)键,才结束第一个进程,同时也
结束整个程序。
键盘输入循环缓冲区算法
#include “stdio.h”
#include “conio.h”
#include “queue.h”
main()
{/*模拟键盘输入循环缓冲区*/
char ch1, ch2;
SeqQueue Q;
int f;
InitQueue (&Q); /* 队列初始化 */
for(;;)
{
for(;;) /*第一个进程*/
{
printf(“A”);
if(kbhit())
{
ch1= getch( ); /* 读取键入的字符,但屏幕上不显示 */
if(ch1==’;’||ch1==’,’) break; /* 第一个进程正常中断 */
f= EnterQueue (&Q, ch1);
if(f==FALSE)
{
printf(“循环队列已满\n”);
break; /* 循环队列满时,强制中断第一个进程*/
}
}
}
while (!IsEmpty(Q)) /*第二个进程*/
{
DeleteQueue (&Q, &ch2);
putchar(ch2); /*显示输入缓冲区的内容*/
}
if(ch1==’.’)
break; /*整个程序结束*/
}
}
C#测试用例:(与上方不同!)
public class _011_QueueApplication : MonoBehaviour
{
SeqQueue<string> queue = new SeqQueue<string>(10);
string input = null, output = null;
private void Update()
{
print("等待输入!");
InputString();
}
public void InputString()
{
if (Input.anyKeyDown)
{
input = Input.inputString;
if (queue.IsFull()) //缓冲循环队列输入已满
{
print("缓冲循环队列输入已满!结束缓冲输入进程");
OutputString();
return;
}
queue.Enqueue(input); //加入缓冲队列
if (input == ";" || input == ",") //正常结束缓冲输入进程
{
print("遇到 ; , 字符正常结束缓冲输入进程");
OutputString();
}
if(input == ".")
{
print("程序终止");
UnityEditor.EditorApplication.isPlaying = false;
OutputString();
}
}
}
public void OutputString()
{
while(!queue.IsEmpty())
{
output += queue.Dequeue();
}
print("显示缓冲输入区的字符: " + output);
}
}
测试结果:
img.jpg
注:
利用队列 先进先出 的特性
网友评论