您的位置:首页 > 理论基础 > 数据结构算法

【数据结构】 队列的应用举例——更好的学习和理解队列

2015-11-27 13:16 645 查看
队列的应用举例1(共2例)

打印杨辉三角

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

1 6 15 20 15 6 1

由上,是7行的杨辉三角形,杨辉三角形的特点是两腰都是数字1,其他位置是其上一行中与之相岭的两个整数之和。所以,在打印过程中,第i行上的元素要由第i-1行中的元素来生成。我们可以利用循环队列实现打印杨辉三角形的过程。在循环队列中依次存放第i-1行上的元素,然后逐个出列并打印,同时生成第i行元素并入列。

以打印第六行,生成第七行为例,如图



前N行的算法描述如下:

void YangHuiTriangle(){
SeqQueue Q;
InitQueue(&Q);
EnterQueue(&Q,1); //第一行入列
for(n=2;n<=N;n++) //产生第n行元素并入列,同时打印第n-1行的元素
{
EnterQueue(&Q,1);  //第一个元素手动加入,为1
for (i=1; i<=n-2; i++)  //除去两个1,中间的n-2个元素用‘和’求出
{
DeleteQueue(&Q,&temp);
Printf("%d",temp);     //出列并打印第n-1行的元素
GetHead(Q,&x);
temp=temp+x;     //求和
EnterQueue(&Q,temp);
}
DeleteQueue(&Q,&x);
printf("%d",x);   //打印 n-1行 最后一个元素
EnterQueue(&Q,1); //n行最后一个元素(1)入列
}
}


队列的应用举例2(共2例)

键盘输入循环缓冲区问题

在操作系统中,循环队列经常用于实时应用程序。我们模拟一种情况。

问题描述:有两个进程同时存在于一个程序中。其中第一个进程在屏幕上连续显示字符‘A’,与此同时,程序不断检测键盘是否有输入,如果有的话,就读入用户键入的字符并保存到输入缓冲区中。在用户输入时,键入的字符并不立即回显在屏幕上。当用户键入一个逗号‘,’时,表示第一进程结束,第二进程从缓冲区中读取那些字符并显示在屏幕上。第二进程结束后,程序又进入第一进程,重新显示字符‘A’,同时用户可以继续键入字符,直到用户输入一个分号‘;’,才结束第一个进程,同时也结束整个程序。

#define MAXSIZE 16
#define QueueElementType char
#define TRUE 1
#define FALSE 0
#define MAXQSIZE 10
#define OVERFLOW -2
#define OK 1
#define ERROR 0
#include "stdio.h"
#include "conio.h"
#include "dos.h"
typedef char QElemType;
struct SqQueue
{
QElemType *base;
int front;
int rear;
};
int InitQueue(struct SqQueue *Q)
{
Q->base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
if (!Q->base) {
exit(OVERFLOW);
}
Q->front=Q->rear=0;
return OK;
}
int isEmpty(struct SqQueue Q)
{
if(Q.front==Q.rear)
return TRUE;
else
return FALSE;
}
int EnterQueue(struct SqQueue *Q,QElemType e)
{
if((Q->rear+1)%MAXQSIZE==Q->front)
return ERROR;
Q->base[Q->rear]=e;
Q->rear=(Q->rear+1)%MAXQSIZE;
return OK;
}
int DeleteQueue(struct SqQueue *Q,QElemType *e)
{
if((Q->front==Q->rear))
return ERROR;
*e =Q->base[Q->front];
Q->front=(Q->front+1)%MAXQSIZE;
return OK;
}

int main()
{
char ch1 = '\0',ch2;
struct SqQueue Q;
int f;
InitQueue(&Q);
for ( ; ; ) {
for( ; ; )
{
printf("A");
if(kbhit()){
ch1=bdos(7,0,0);
f=EnterQueue(&Q,ch1);
if (f==FALSE) {
printf("循环队列已满\n");
break;
}
}
if (ch1==';'||ch1==',') {
break;
}
}
while(!isEmpty(Q))
{
DeleteQueue(&Q, &ch2);
putchar(ch2);
}
if (ch1==';') {
break;
}else
ch1=' ';

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: