一、实验目的
1.掌握队列的实现;
2.掌握队列的应用;
二、实验环境
windows 10、Visual C++6.0
三、实验内容
1、编写程序,实现杨辉三角的打印算法;
#define TRUE 1
#define FALSE 0
#define MAXSIZE 50 /*队列的最大长度*/
#include <stdio.h>
typedef struct
{
int element[MAXSIZE]; /* 队列的元素空间*/
int front;
int rear;
}SeqQueue;
/*初始化操作*/
void InitQueue(SeqQueue *Q)
{
/* 将*Q初始化为一个空的循环队列 */
Q->front=Q->rear=0;
}
/*入队操作*/
int EnterQueue(SeqQueue *Q, int x)
{
/*将元素x入队*/
if((Q->rear+1)%MAXSIZE==Q->front) /*队列已经满了*/
return(FALSE);
Q->element[Q->rear]=x;
Q->rear=(Q->rear+1)%MAXSIZE; /* 重新设置队尾指针 */
return(TRUE); /*操作成功*/
}
/*出队操作*/
int DeleteQueue(SeqQueue *Q, int *x)
{
/*删除队列的队头元素,用x返回其值*/
if(Q->front==Q->rear) /*队列为空*/
return(FALSE);
*x=Q->element[Q->front];
Q->front=(Q->front+1)%MAXSIZE; /*重新设置队头指针*/
return(TRUE); /*操作成功*/
}
int GetHead(SeqQueue *Q, int *x)
{
/*提取队列的队头元素,用x返回其值*/
if(Q->front==Q->rear) /*队列为空*/
return(FALSE);
*x=Q->element[Q->front];
return(TRUE); /*操作成功*/
}
void YangHuiTriangle( )
{
int n;
int i;
int temp;
int x;
int N;
SeqQueue Q;
InitQueue(&Q);
EnterQueue(&Q,1); /* 第一行元素入队*/
printf("please input N:");
scanf("%d",&N);
for(n=2;n<=N;n++) /* 产生第n行元素并入队,同时打印第n-1行的元素*/
{
EnterQueue(&Q,1); /* 第n行的第一个元素入队*/
for(i=1;i<=n-2;i++) /* 利用队中第n-1行元素产生第n行的中间n-2个元素并入队*/
{
DeleteQueue(&Q,&temp);
printf("%6d",temp); /* 打印第n-1行的元素*/
GetHead(&Q,&x);
temp=temp+x; /*利用队中第n-1行元素产生第n行元素*/
EnterQueue(&Q,temp);
}
DeleteQueue (&Q,&x);
printf("%6d",x); /* 打印第n-1行的最后一个元素*/
EnterQueue(&Q,1); /* 第n行的最后一个元素入队*/
printf("\n");
}
}
int main()
{
YangHuiTriangle( );
}
//----------------------------------杨辉三角的打印算法
2、编写程序,实现键盘输入循环缓冲区问题
#define TRUE 1
#define FALSE 0
#define QueueElementType char
#define MAXSIZE 50 /*队列的最大长度*/
#include "stdio.h"
#include "conio.h"
typedef struct
{
QueueElementType element[MAXSIZE]; /* 队列的元素空间*/
int front; /*头指针指示器*/
int rear; /*尾指针指示器*/
}SeqQueue;
/*初始化操作*/
void InitQueue(SeqQueue *Q)
{
/* 将*Q初始化为一个空的循环队列 */
Q->front=Q->rear=0;
}
/*入队操作*/
int EnterQueue(SeqQueue *Q, QueueElementType x)
{
/*将元素x入队*/
if((Q->rear+1)%MAXSIZE==Q->front) /*队列已经满了*/
return(FALSE);
Q->element[Q->rear]=x;
Q->rear=(Q->rear+1)%MAXSIZE; /* 重新设置队尾指针 */
return(TRUE); /*操作成功*/
}
/*出队操作*/
int DeleteQueue(SeqQueue *Q, QueueElementType *x)
{
/*删除队列的队头元素,用x返回其值*/
if(Q->front==Q->rear) /*队列为空*/
return(FALSE);
*x=Q->element[Q->front];
Q->front=(Q->front+1)%MAXSIZE; /*重新设置队头指针*/
return(TRUE); /*操作成功*/
}
int GetHead(SeqQueue *Q, QueueElementType *x)
{
/*提取队列的队头元素,用x返回其值*/
if(Q->front==Q->rear) /*队列为空*/
return(FALSE);
*x=Q->element[Q->front];
return(TRUE); /*操作成功*/
}
int IsEmpty(SeqQueue *Q)
{
/*提取队列的队头元素,用x返回其值*/
if(Q->front==Q->rear) /*队列为空*/
return(TRUE);
else
return(FALSE); /*操作成功*/
}
main()
{
char ch1,ch2;
SeqQueue Q;
int f;
InitQueue (&Q);
while(TRUE)
{
while(TRUE)
{
printf("A");
if(kbhit())
{
ch1=getch();
if(ch1==';'||ch1=='.')
break;
f= EnterQueue(&Q,ch1);
if(f==FALSE)
{
printf("full");
break;
}
}
}
while (!IsEmpty(&Q))
{
DeleteQueue(&Q,&ch2);
putchar(ch2);
}
getch();
if(ch1=='.') break;
}
}
//----------------------------------键盘输入循环缓冲区问题
四、实验结果与分析
分析:先定义一个二维数组:a[N][N],略大于要打印的行数。再令两边的数为 1,即当每行的第一个数和最后一个数为 1。a[i][0]=a[i][i-1]=1,n 为行数。除两边的数外,任何一个数为上两顶数之和,即 a[i][j] = a[i-1][j-1] + a[i-1][j]。最后输出杨辉三角。
2.
分析:有两个进程同时存在于一个程序中。其中第一个进程在屏幕上连续显示字符“A”,与此同时,程序不断检测键盘是否有输入,如果有的话,就读入用户键入的字符并保存到输入缓冲区中。在用户输入时,键入的字符并不立即回显在屏幕上。当用户键入一个逗号(,)或分号(;)时,表示第一个进程结束,第二个进程从缓冲区中读取那些已键入的字符并显示在屏幕上。第二个进程结束后,程序又进入第一个进程,重新显示字符“A”,同时用户又可以继续键入字符,直到用户输入一个分号(;)键,才结束第一个进程,同时也结束整个程序。