【数据结构】 队列的应用举例——更好的学习和理解队列
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行的算法描述如下:
队列的应用举例2(共2例)
键盘输入循环缓冲区问题
在操作系统中,循环队列经常用于实时应用程序。我们模拟一种情况。
问题描述:有两个进程同时存在于一个程序中。其中第一个进程在屏幕上连续显示字符‘A’,与此同时,程序不断检测键盘是否有输入,如果有的话,就读入用户键入的字符并保存到输入缓冲区中。在用户输入时,键入的字符并不立即回显在屏幕上。当用户键入一个逗号‘,’时,表示第一进程结束,第二进程从缓冲区中读取那些字符并显示在屏幕上。第二进程结束后,程序又进入第一进程,重新显示字符‘A’,同时用户可以继续键入字符,直到用户输入一个分号‘;’,才结束第一个进程,同时也结束整个程序。
打印杨辉三角
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=' '; } }
相关文章推荐
- 数据结构——使用双端链表实现队列(java实现)
- 数据结构——用(单端)链表实现栈(java实现)
- 数据结构实验之图论八:欧拉回路 无向图的欧拉回路判断
- C#数据结构之单链表(LinkList)实例详解
- C#数据结构之顺序表(SeqList)实例详解
- 数据结构实验之图论四:迷宫探索
- 数据结构实验之图论四:迷宫探索 【基于邻接表的广度优先搜索】
- 数据结构实验之图论七:驴友计划
- Redis数据结构详解之Zset(五)
- 第13周SHH数据结构-【项目4-Floyd算法的验证 】
- 第十二周--数据结构--判断图G中是否存在边<i,j>
- 第十二周--数据结构--计算图G中出度为0的顶点数
- 第13周SHH数据结构-【项目3-Dijkstra算法的验证 】
- 第13周SHH数据结构-【项目2-Kruskal算法的验证 】
- 第十二周--数据结构--求出度最大的一个顶点并输出该顶点编号
- 第13周SHH数据结构-【项目1-Prim算法的验证 】
- 第十二周--数据结构--输出出图G中每个顶点的出度
- redis数据结构-字典
- 一天一个数据结构之ArrayList
- 【数据结构】图的常用存储结构