数据结构——队列的应用

合集下载

队列研究的经典例子

队列研究的经典例子

队列研究的经典例子队列是一种常用的数据结构,它遵循先进先出(FIFO)的原则。

在实际应用中,队列有许多经典的例子,下面将列举十个例子来说明队列的应用。

1. 银行排队:在银行柜台,顾客需要按照先来先服务的原则进行办理业务。

银行通过队列来管理顾客的排队顺序,保证公平性,提高效率。

2. 线程调度:在操作系统中,线程调度器使用队列来管理待执行的线程。

每个线程都被加入到队列中,按照优先级或其他调度算法进行调度,确保线程按照特定的顺序执行。

3. 消息队列:在分布式系统中,消息队列用于解耦不同模块之间的通信。

消息生产者将消息发送到队列,消息消费者从队列中取出消息进行处理,实现模块之间的解耦和异步通信。

4. 缓存淘汰策略:在计算机系统中,缓存用于加快数据访问速度。

当缓存空间不足时,采用最先进入队列的数据进行淘汰,保证缓存中的数据是最新和最常使用的。

5. 打印队列:在打印机中,打印任务按照先后顺序加入到打印队列中,打印机按照队列顺序依次打印任务,保证打印任务的顺序和完整性。

6. 网络数据包处理:在网络通信中,数据包按照先后顺序加入到数据包队列中,网络设备按照队列顺序处理数据包,确保数据包的传输顺序和完整性。

7. 飞机起降顺序:在航空管制中,飞机按照先后顺序排队等待起飞或降落。

航空管制员通过队列来管理飞机的起降顺序,确保飞机的安全和运行效率。

8. 食堂排队:在学校或企事业单位的食堂,学生或员工需要按照先来先服务的原则排队就餐。

食堂通过队列来管理就餐顺序,确保公平和有序。

9. 电梯调度:在多层建筑中,电梯系统通过队列来管理乘客的乘坐顺序。

乘客按照先后顺序加入电梯队列,电梯按照队列顺序依次运送乘客,提高电梯的运行效率。

10. 任务调度:在计算机系统中,任务调度器使用队列来管理待执行的任务。

每个任务都被加入到队列中,按照优先级或其他调度算法进行调度,确保任务按照特定的顺序执行。

以上是队列在实际应用中的十个经典例子。

这些例子展示了队列在不同领域的广泛应用,通过队列可以实现任务的排队、调度和处理,提高系统的效率和性能。

数据结构实验三栈和队列的应用

数据结构实验三栈和队列的应用

数据结构实验三栈和队列的应用数据结构实验三:栈和队列的应用在计算机科学领域中,数据结构是组织和存储数据的重要方式,而栈和队列作为两种常见的数据结构,具有广泛的应用场景。

本次实验旨在深入探讨栈和队列在实际问题中的应用,加深对它们特性和操作的理解。

一、栈的应用栈是一种“后进先出”(Last In First Out,LIFO)的数据结构。

这意味着最后进入栈的元素将首先被取出。

1、表达式求值在算术表达式的求值过程中,栈发挥着重要作用。

例如,对于表达式“2 + 3 4”,我们可以通过将操作数压入栈,操作符按照优先级进行处理,实现表达式的正确求值。

当遇到数字时,将其压入操作数栈;遇到操作符时,从操作数栈中弹出相应数量的操作数进行计算,将结果压回操作数栈。

最终,操作数栈中的唯一值就是表达式的结果。

2、括号匹配在程序代码中,检查括号是否匹配是常见的任务。

可以使用栈来实现。

遍历输入的字符串,当遇到左括号时,将其压入栈;当遇到右括号时,弹出栈顶元素,如果弹出的左括号与当前右括号类型匹配,则继续,否则表示括号不匹配。

3、函数调用和递归在程序执行过程中,函数的调用和递归都依赖于栈。

当调用一个函数时,当前的执行环境(包括局部变量、返回地址等)被压入栈中。

当函数返回时,从栈中弹出之前保存的环境,继续之前的执行。

递归函数的执行也是通过栈来实现的,每次递归调用都会在栈中保存当前的状态,直到递归结束,依次从栈中恢复状态。

二、队列的应用队列是一种“先进先出”(First In First Out,FIFO)的数据结构。

1、排队系统在现实生活中的各种排队场景,如银行排队、餐厅叫号等,可以用队列来模拟。

新到达的顾客加入队列尾部,服务完成的顾客从队列头部离开。

通过这种方式,保证了先来的顾客先得到服务,体现了公平性。

2、广度优先搜索在图的遍历算法中,广度优先搜索(BreadthFirst Search,BFS)常使用队列。

从起始节点开始,将其放入队列。

数据结构中的栈与队列的应用场景

数据结构中的栈与队列的应用场景

数据结构中的栈与队列的应用场景栈与队列是数据结构中常见的两种基本数据类型,它们在不同的应用场景中发挥着重要作用。

下面将分别介绍栈和队列的应用场景。

栈的应用场景:1. 编辑器的撤销操作:在编辑器中,撤销(undo)操作是一个常见需求。

撤销操作通常是按照用户操作的反序执行,因此可以使用栈来存储每一次的操作,当用户执行撤销操作时,从栈中弹出最近的操作并执行对应的反操作。

2. 后退按钮的实现:在浏览器中,后退按钮用于返回上一个访问的网页。

通过使用栈来存储用户的访问记录,每当用户访问一个新的页面时,将该页面的地址压入栈中。

当用户点击后退按钮时,从栈中弹出最近访问的页面地址并跳转到该页面。

3. 函数调用与返回:在程序中,函数的调用和返回通常遵循“后进先出”的原则,即后调用的函数先返回。

因此,可以使用栈来实现函数调用与返回的过程。

每当一个函数被调用时,将该函数的执行环境(包括参数、局部变量等)压入栈中;当函数执行完毕后,从栈中弹出该函数的执行环境,恢复上一个函数的执行。

队列的应用场景:1. 消息队列:在分布式系统和异步通信中,消息队列用于解耦发送方和接收方之间的耦合性。

发送方将消息发送到队列的末尾,接收方从队列的头部获取消息进行处理。

消息队列可以实现异步处理、削峰填谷等功能,常见的消息队列系统有RabbitMQ和Kafka等。

2. 操作系统中的进程调度:在操作系统中,进程调度用于控制多个进程的执行顺序。

常见的调度算法中,有使用队列来实现的先来先服务(FCFS)调度算法和轮转调度算法。

进程按照到达时间的顺序加入队列,在CPU空闲时,从队列的头部取出一个进程执行。

3. 打印队列:在打印机等资源共享环境中,通常会使用打印队列来管理多个打印请求。

每当用户提交一个打印请求时,将该请求加入打印队列的末尾,打印机从队列的头部取出请求进行打印。

这样可以保证每个用户的打印请求按照提交的顺序进行处理。

综上所述,栈和队列在不同的应用场景中发挥着重要作用。

数据结构中队列的典型实际应用案例分析---------场地安排、比赛赛程安排等等--C++

数据结构中队列的典型实际应用案例分析---------场地安排、比赛赛程安排等等--C++

数据结构中队列的典型实际应⽤案例分析---------场地安排、⽐赛赛程安排等等--C++马上找⼯作了,最近⼜重新学起了数据结构,打算从现在开始,把学习过程中的⼼得体会和⼤家分享⼀下。

当然这些内容会显得肤浅,但是希望会对新⼿有些帮助。

⼤⽜可以绕路咯。

好了,我们直奔主题,我们开始分析⼀下现实中的⼀中典型需求,以此作为开始:实际问题:⼀个运动会:有game_num个项⽬;有anthelete_num名运动员;每个运动员最多的参加max个项⽬;问:怎么安排⽐赛才能使⽐赛组数最少(即如何安排各项⽐赛,既没有冲突,⼜使得⽐赛时间最短?)。

分析:⾸先我们根据报名情况可以建⽴⼀个运动员参赛冲突关系矩阵collusion,是game_num*game_num的⼆维矩阵,元素0代表⽆冲突,1代表有冲突。

例如,某个运动员报名的项⽬为(0,2,4)则对应的collusion[0][2],collusion[0][4],collusion[2][0],collusion[4][0],collusion[4] [2],collusion[2][4]的值为1.然后我们借助⼀个队列记录还未分组的项⽬,⼀个数组clash记录与该组冲突的⽐赛项⽬,其⼤⼩为game_num。

过程:初始时,把分组的组号初始化为0,并且把所有⽐赛项⽬进队列,表⽰所有项⽬都没有分组。

然后逐⼀出队列,进⾏分组,知道队列为空,分组完毕。

对于出队列的项⽬i,⾸先判断是否开始⼀轮新的⽐赛项⽬。

⼀般出队列的项⽬号都⼤于先前出队列的项⽬号,如果⼩于,则说明开始⼀轮新的⽐赛项⽬,⼀个新的分组开始。

此时,把分组的组号加1,数组clash置0,准备下⾯的同组成员判定。

(1)如果数组项⽬i对应的元素clash[i]为0,表⽰当前组可以接受该项⽬,记录该项⽬i的分组号,且把该项⽬的⽐赛冲突信息叠加到数组clash中,即把运动员参赛冲突关系矩阵collusion的第i+1⾏叠加到数组clash上。

队列的应用场景

队列的应用场景

队列的应用场景1. 应用背景队列是一种常见的数据结构,它遵循先进先出(FIFO)的原则。

在实际应用中,队列常常用来解决一些需要按顺序处理的问题。

队列的应用场景非常广泛,下面将介绍其中几个典型的应用场景。

2. 应用过程2.1 网络请求队列在高并发的网络环境中,服务器往往需要处理大量的请求。

为了保证服务器的稳定性和性能,我们可以使用队列来管理这些请求。

具体的应用过程如下:•当有请求到达时,将请求加入队列;•服务器按照队列中请求的顺序进行处理;•处理完一个请求后,从队列中移除该请求。

这种应用场景下,队列可以有效地控制请求的处理顺序,避免服务器因为请求过多而崩溃,同时保证了公平性,每个请求都能够得到处理。

2.2 消息队列消息队列是一种常见的异步通信机制,常用于解耦和提高系统的可伸缩性。

具体的应用过程如下:•发送者将消息放入队列中;•接收者从队列中获取消息并进行处理。

消息队列可以实现不同模块之间的解耦,发送者和接收者可以独立地进行开发和部署。

通过消息队列,可以实现高效的异步通信,提高系统的吞吐量和响应速度。

2.3 任务调度队列在任务调度系统中,队列常常用来管理待执行的任务。

具体的应用过程如下:•将待执行的任务加入队列;•调度器按照队列中任务的顺序进行调度;•执行完一个任务后,从队列中移除该任务。

任务调度队列可以实现任务的有序执行,避免任务之间的冲突和竞争。

通过合理地设置队列的优先级和调度策略,可以实现任务的高效调度和资源利用。

2.4 简单消息服务(SMS)简单消息服务(Simple Message Service,SMS)是一种常见的通信服务,常用于发送短信、推送通知等。

具体的应用过程如下:•将待发送的消息加入队列;•消息服务按照队列中消息的顺序进行发送;•发送完一个消息后,从队列中移除该消息。

SMS队列可以实现消息的有序发送,确保消息的可靠性和时效性。

通过使用队列,可以有效地控制消息的发送速度,避免服务器负载过大。

数据结构之队列队列的概念实现方式和应用场景

数据结构之队列队列的概念实现方式和应用场景

数据结构之队列队列的概念实现方式和应用场景队列是一种常见的数据结构,它按照先进先出(First-In-First-Out,FIFO)的原则,对数据进行存储和访问。

在本文中,我们将讨论队列的概念、实现方式以及常见的应用场景。

一、队列的概念队列是一种线性数据结构,它由一系列元素组成,其中每个元素都包含自身的数据以及指向下一个元素的指针。

队列有两个基本操作:入队和出队。

入队操作将元素插入到队列的末尾,而出队操作则从队列的头部移除元素。

队列的特点是先进先出,在队列中,新元素总是被添加到队列的末尾,而最早添加的元素总是在队列的头部。

这一特点使队列非常适合于模拟实际生活中的排队场景。

二、队列的实现方式1. 顺序队列:顺序队列是使用数组来实现的队列,它具有固定的大小。

数组的索引表示队列中元素的位置,使用两个指针front和rear分别指向队列的头部和尾部。

入队操作:将元素添加到rear指针所指向的位置,并将rear指针后移一位。

出队操作:将front指针所指向的元素移除,并将front指针后移一位。

顺序队列的主要优势是访问元素的速度较快,但其缺点是在入队和出队操作频繁时,会造成大量元素的移动。

2. 链式队列:链式队列使用链表来实现,这样可以解决顺序队列中需要移动大量元素的问题。

链式队列由一系列结点组成,每个结点包含一个数据元素和指向下一个结点的指针。

入队操作:创建一个新的结点,并将其添加到链表的尾部,更新rear指针。

出队操作:将链表的头部结点移除,并更新front指针。

链式队列的优势是没有固定的大小限制,可以根据需要动态地分配内存空间。

但其缺点是访问元素的速度较慢,需要通过指针进行遍历。

三、队列的应用场景队列在计算机科学中有广泛的应用。

下面列举一些常见的应用场景:1. 线程池:线程池中的任务通常以队列的形式进行排队,工作线程从队列中获取任务并执行。

2. 消息队列:在分布式系统中,消息队列用于异步通信,生产者将消息发送到队列中,而消费者从队列中获取消息进行处理。

队列研究的应用类型

队列研究的应用类型

队列研究的应用类型及实际应用情况1. 应用背景队列研究广泛应用于各个领域,如运输、通信、计算机科学等。

队列是一种线性数据结构,具有先进先出(FIFO)的特性,适用于需要按先后顺序处理数据的场景。

通过研究队列的应用类型,可以更好地理解和应用队列数据结构。

2. 应用过程队列研究的应用类型包括但不限于以下几种。

2.1. 任务调度在许多系统中,需要对任务进行调度和处理。

任务调度是队列研究的一个重要应用。

例如,操作系统中的进程调度就可以看作是一个队列中任务的调度过程。

操作系统根据任务的优先级和到达时间等属性,将任务按顺序加入队列,并依次处理。

任务调度的有效性直接影响系统的性能和响应时间。

2.2. 消息传递在通信系统中,队列可以被用于实现消息传递。

例如,邮件服务器接收用户发送的邮件,并将邮件按照先后顺序放入队列中等待发送。

该过程中,队列维护了一个待发送的邮件队列,根据邮件的到达时间确定其发送顺序。

2.3. 广播广播是一种将消息发送给多个接收者的通信方式。

队列在广播中起到了重要的作用。

消息发送者将消息放入队列中,接收者从队列中读取消息。

通过队列的方式,发送者和接收者之间解耦,提高了系统的灵活性和并行处理能力。

广播队列常见的应用包括消息队列系统和事件驱动系统。

2.4. 缓冲区管理在计算机科学中,队列常被用于缓冲区管理。

例如,硬盘驱动器在向计算机传输数据时,数据可以先存储在一个队列中,然后按照先后顺序传输给计算机。

这样可以有效地管理数据的读写速度,防止数据丢失或溢出。

2.5. 数据结构实现队列作为一种基本的数据结构,可以用于实现更复杂的数据结构。

例如,栈可以由两个队列实现。

一个队列用于入栈操作,另一个队列用于出栈操作。

通过队列的先进先出特性,可以实现栈的功能。

3. 应用效果队列研究的应用类型在实际应用中具有以下效果:•提高系统性能和处理能力:任务调度、消息传递和广播等应用可以优化系统的资源利用和执行效率,提高系统的处理能力和响应时间。

数据结构中队列的应用研究

数据结构中队列的应用研究

Bsd a e
o t i f at rБайду номын сангаас , u u i u e t s u y h w t s mu at t e m n g m nt m h d . n hs e u qee S sd o t d o o i l e h a a e e et o s
T e A p ia in R s a c o Q e e i D t S r c u e h p l c t o e er h f u u n a a t u t r
Y W n E e
(in s R d o & T U i e st W j n c l e e Jagu a i V n v r iy u i o l g
2队列在停车场管理 中的应用 、
数据结 构课 程设计 中的停 车场 管理系统一般都采用 栈 +队列来模拟
管 理 程 序 。 假 设停 车场 是 一 个 可 停 放 n辆 汽 车 的 狭 长 通 道 , 只 有 一 个 大 且
首先输入 离开车辆的车牌号以及 离开 时间, 计算其停放 时间并收取相 应的停车费用 , 然后记录要离开车辆 的位置 , 该位置置空。 如果便道上有等 待的车辆, 让便道上的第一辆 车进入停车场 , 以现在 的时间作为车辆到达
为计算机专业 的一 门专业基础必修课程 。 我们研 究数据 结构 的目的是为了 学 会 如何 更 好 地 编 写 出 效 率 更 高 的程 序 。 数据 结 构 是 一 门研 究 非 数 值 计 算 的程 序 设计 问 题 中 计 算 机 的操 作 对
象 以及 它 们 之 间 的 关 系 和 操作 等 等 的学 科 。 数据 结 构 的研 究 不 仅 涉及 到计
录。
2 2系 统 设 计及 实现 . 2 2 1车 辆 到达 .. 先 输 入 到 达 车辆 的车 牌 号 , 停 车 场 未 满 , 车 进 停 车 场 , 若 则 输入 到达 时 间, 录 该 车辆 在 停 车 场 的位 置 。若 停 车 场 己 满 , 车进 便 道 , 录 该 车 在 记 则 记 便 道 的 位 置 。 道 的 管 理 是最 先 到 达 的 车 辆 在 最 前面 , 旦 停 车场 有空 位 , 便 一 最 前 面 的车 辆 最 先 进 入 停 车 场 , 合 队列 的先 进 先 出操 作特 性 。可 以用 一 符 个 链 队 来 实 现 , 时只 需 要 改 变 便 道 上 车 辆 结 点 的 连 接 方 式 , 模 拟 便 道 此 将 的链 队 头 结 点连 到 原 来 的第 二 辆 车 上 就 可 以 了 。 2 22车 辆 离 开 ..
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

软件学院上机实验报告课程名称:数据结构实验项目:队列的应用实验室:耘慧420 姓名:学号专业班级:实验时间: 2016.11.17一、实验目的及要求(一) 目的1.掌握栈队列特点及顺序存储结构(循环队列)下基本操作的实现。

2.掌握队列的应用,能根据问题特点选择队列结构。

(二).要求1.定义循环队列的存储结构2.完成入队、出队、取队头等基本操作的实现。

3.利用队列的基本操作实现n行杨辉三角的输出。

4.主函数调用杨辉三角输出函数,实现n行杨辉三角输出。

二、性质设计性三、实验学时2学时四、实验环境C与C++程序设计学习与实验系统五、实验内容及步骤(一).内容1.定义循环队列的存储结构,完成入队、出队、取队头等基本操作的实现。

2. 利用循环队列实现杨辉三角的输出(二).步骤1.//---------循环队列—队列的顺序存储结构 -----#define MAXSIZE 100typedef struct {QElemType *base; //初始化的动态分配存储空间int front; //头指针,队列不空指向队列头元素int rear; //尾指针,队列不空指向队列尾元素下一位置} SqQueue;2.杨辉三角:11 11 2 11 3 3 11 4 6 4 1……………………这是一个初等数学中讨论的问题。

系数表中的第 k行有 k个数,除了第一个和最后一个数为1之外,其余的数则为上一行中位其左、右的两数之和。

如果要求计算并输出杨辉三角前n行的值,则队列的最大空间应为 n+2。

假设队列中已存有第 k 行的计算结果,并为了计算方便,在两行之间添加一个"0"作为行界值,则在计算第 k+1 行之前,头指针正指向第 k 行的"0",而尾元素为第 k+1 行的"0"。

由此从左到右依次输出第 k 行的值,并将计算所得的第 k+1 行的值插入队列的基本操作为:void YangHui(int n){printf("1\n");EnQueue(&q,0); /*开始*/EnQueue(&q,1); /*第1行*/EnQueue(&q,1);for(j=2;j<=n;j++){EnQueue(&q,0);do{DeQueue(&q,&s);GetHead(&q,&t);if(t) printf("%d\t",t); /*非0输出,否则换行*/ else printf("\n");EnQueue(&q,s+t);}while(t!=0); /*遇到结束符前循环*/}DeQueue(&q,&s);}六、实验数据及结果分析1.详细记录在调试过程中出现的问题及解决方法;杨辉三角;首先输入程序需要打印出来杨辉三角的行数N。

(截图的N值为12),N值要求小于等于20。

之后运行程序,即得到如下结果队列进队七、总结通过对本程序的练习,更好地掌握了队列的概念和相关操作,对杨辉三角的算法、队列的进队出队有了更深刻的认识。

在实验中,增强了C语言开发的语法知识,体会到自己C语言知识的不足,造成了自己调试程序没有那么顺利。

以后要增加C语言和C++语言的区别。

使得自己更快,更准的进行程序的调试。

附录源程序清单插入;队列进队;#include "stdio.h"#include "malloc.h"#define OK 1#define OVERFLOW -1#define ERROR 0#define QMAXSIZE 23//定义长度,长度>=输出行数+3typedef int ElemType;typedef int Status;typedef struct{ElemType data[ QMAXSIZE ];//定义数据域ElemType *base; //初始化的动态分配存储空间int front; //头指针,队列不空指向队列头元素int rear; //尾指针,队列不空指向队列尾元素下一位置}SqQueue;Status InitQueue(SqQueue *Q){//构造空队列Q->base=(ElemType *)malloc(QMAXSIZE * sizeof(ElemType));//分配空间if(!Q->base)return ERROR;Q->front=Q->rear=0;return OK;}Status QueueLength(SqQueue Q){//获取队列长度return (Q.rear-Q.front+QMAXSIZE)%QMAXSIZE;}Status GetHead(SqQueue Q){//返回队头元素ElemType e;if(Q.front == Q.rear)e=0;elsee=Q.data[Q.front];return e;}Status EnQueue(SqQueue *Q,ElemType e){//插入元素if((Q->rear+1)% QMAXSIZE == Q->front)return ERROR;Q->data[Q->rear]=e;Q->rear=(Q->rear+1)%QMAXSIZE;return OK;}Status DeQueue(SqQueue *Q,ElemType *e) {//删除元素if(Q->front == Q->rear)return ERROR;*e=Q->data[Q->front];Q->front=(Q->front+1)%QMAXSIZE;return OK;}Status QueueEmpty(SqQueue *Q){//判断队列是否为空if(Q->front==Q->rear)return OK;elsereturn ERROR;}void TraversalSq(SqQueue Q){//遍历队列ElemType s;do{DeQueue(&Q,&s);printf("%d\t",s);}while(!QueueEmpty(&Q));printf("\n");}void main(){SqQueue Q;ElemType e;if(InitQueue(&Q))printf("队列构造成功!\n");elseprintf("队列构造失败!\n");while(e!=0){printf("请输入要插入的数据:");scanf("%d",&e);if(e==0)break;if(EnQueue(&Q,e))printf("入队成功!\n");elseprintf("入队失败!\n");}printf("队列长度为:%d\n",QueueLength(Q));printf("队头元素为:%d\n",GetHead(Q));TraversalSq(Q);if(!QueueEmpty(&Q))printf("队列不为空!\n");elseprintf("队列为空!\n");}杨辉三角;#include "stdio.h"#include "malloc.h"#define OK 1#define OVERFLOW -1#define ERROR 0#define QMAXSIZE 23//定义长度,长度>=输出行数+3typedef int ElemType;typedef int Status;typedef struct{ElemType data[ QMAXSIZE ];//定义数据域ElemType *base; //初始化的动态分配存储空间int front; //头指针,队列不空指向队列头元素int rear; //尾指针,队列不空指向队列尾元素下一位置}SqQueue;Status InitQueue(SqQueue *Q){//构造空队列Q->base=(ElemType *)malloc(QMAXSIZE * sizeof(ElemType));//分配空间if(!Q->base)return ERROR;Q->front=Q->rear=0;return OK;}Status QueueLength(SqQueue Q){//获取队列长度return (Q.rear-Q.front+QMAXSIZE)%QMAXSIZE;}void GetHead(SqQueue Q,ElemType *e){//返回队头元素if(Q.front == Q.rear)*e=0;else*e=Q.data[Q.front];}Status EnQueue(SqQueue *Q,ElemType e){//插入元素if((Q->rear+1)% QMAXSIZE == Q->front)return ERROR;Q->data[Q->rear]=e;Q->rear=(Q->rear+1)%QMAXSIZE;return OK;}Status DeQueue(SqQueue *Q,ElemType *e) {//删除元素if(Q->front == Q->rear)return ERROR;*e=Q->data[Q->front];Q->front=(Q->front+1)%QMAXSIZE;return OK;}Status QueueEmpty(SqQueue *Q){//判断队列是否为空if(Q->front==Q->rear)return OK;elsereturn ERROR;}void TraversalSq(SqQueue Q,ElemType n) {//遍历队列ElemType s;printf("第%d行:",n);do{DeQueue(&Q,&s);printf("%d\t",s);}while(!QueueEmpty(&Q));printf("\n");void YangHui(int n){//杨辉三角SqQueue Q;ElemType j,s,t;printf("第1行:1\n");InitQueue(&Q);EnQueue(&Q,0); /*开始*/EnQueue(&Q,1); /*第1行*/EnQueue(&Q,1);for(j=2;j<n;j++)//从第二行开始循环到n-1行{EnQueue(&Q,0); /*第j行的结束符*/printf("第%d行:",j);do{DeQueue(&Q,&s);GetHead(Q,&t);if(t)printf("%d\t",t); /*非0输出,否则换行*/ elseprintf("\n");EnQueue(&Q,s+t);}while(t!=0); /*遇到结束符前循环*/}DeQueue(&Q,&s); //输出最后一行TraversalSq(Q,j);main(){ElemType n;while(1){printf("请输入输出的行数(小于等于%d):",QMAXSIZE-3);scanf("%d",&n);if(n<=(QMAXSIZE-3)&&n>1){YangHui(n);break;}elseprintf("输入错误,请重新输入\n");}getch();}。

相关文档
最新文档