【数据结构与算法】 队列——队列的应用举例

队列的应用举例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=' ';
        
    }
}


  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值