#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define OVERFLOW -2
#define INFEASIBLE -1
#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
#define MAXQSIZE 10
typedef char QElemType;
struct SqQueue
{
QElemType *base;
int front;
int rear;
};
int InitQueue(SqQueue *Q)
{ // 构造一个空队列Q
Q->base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
if(!Q->base) // 存储分配失败
exit(OVERFLOW);
Q->front=Q->rear=0;
return OK;
}
int QueueEmpty(SqQueue Q)
{ // 若队列Q为空队列,则返回TRUE,否则返回FALSE
if(Q.front==Q.rear) // 队列空的标志
return TRUE;
else
return FALSE;
}
int EnQueue(SqQueue *Q,QElemType e)
{ // 插入元素e为Q的新的队尾元素
if((Q->rear+1)%MAXQSIZE==Q->front) // 队列满
return ERROR;
Q->base[Q->rear]=e;
Q->rear=(Q->rear+1)%MAXQSIZE;
return OK;
}
int DeQueue(SqQueue *Q,QElemType *e)
{ // 若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
if(Q->front==Q->rear) // 队列空
return ERROR;
*e=Q->base[Q->front];
Q->front=(Q->front+1)%MAXQSIZE;
return OK;
}
void main()
{//模拟键盘输入循环缓冲区
char ch1,ch2;
SqQueue Q;
int f;
InitQueue(&Q);
for(;;)
{
for(;;) //第1个进程
{
printf("A/n");
if(kbhit())
{
ch1=getch();
if(ch1==','||ch1=='.') break; //第1个进程正常中断
f=EnQueue(&Q,ch1);
if(f==ERROR) //循环队列满时强制中断第1个进程
{
printf("循环队列已满!/n");
break;
}
}
}
while(!QueueEmpty(Q)) //第2个进程
{
DeQueue(&Q,&ch2);
putchar(ch2); //显示输入缓冲区的内容
}
if(ch1=='.')break;
}
}