1 / 22

使用堆栈解决编程问题

使用堆栈解决编程问题. 数据结构 (C# 语言版 ). 目标. 在本章中 , 你将学到 : 识别堆栈的特性 实施堆栈 运用堆栈来解决编程问题. 学习情境 —— 用堆栈解决火车车厢重排问题的编程. [ 问题描述 ]

margie
Download Presentation

使用堆栈解决编程问题

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 使用堆栈解决编程问题 数据结构(C#语言版)

  2. 目标 • 在本章中,你将学到: • 识别堆栈的特性 • 实施堆栈 • 运用堆栈来解决编程问题

  3. 学习情境——用堆栈解决火车车厢重排问题的编程学习情境——用堆栈解决火车车厢重排问题的编程 [问题描述] 一列货运列车共有n节车厢,每节车厢将停放在不同的车站。假定n个车站的编号分别为1 -n,货运列车按照第n站至第1站的次序经过这些车站。车厢的编号与它们的目的地相同。为了便于从列车上卸掉相应的车厢,必须重新排列车厢,使各车厢从前至后按编号1到n的次序排列。当所有的车厢都按照这种次序排列时,在每个车站只需卸掉最后一节车厢即可。我们在一个转轨站里完成车厢的重排工作,在转轨站中有一个入轨、一个出轨和k个缓冲铁轨(位于入轨和出轨之间)。图3.1a 给出了一个转轨站,其中有k= 3个缓冲铁轨H1,H2和H3。开始时,n节车厢的货车从入轨处进入转轨站,转轨结束时各车厢从右到左按照编号1至编号n的次序离开转轨站(通过出轨处)。在图3.1a 中,n= 9,车厢从后至前的初始次序为5,8,1,7,4,2,9,6,3。图3.1b 给出了按所要求的次序重新排列后的结果。

  4. 学习情境——用线性表解决学生成绩表的编程 [问题描述](续) • 根据上面的描述,编写程序实现下面的功能: • 编写一算法实现火车车箱的重排; • 编写程序模拟图3.1所示的具有9节车厢的火车入轨和出轨的过程。 • 程序主界面设计如图3.2所示。

  5. 认识堆栈——分析堆栈的逻辑结构 堆栈 • 让我们来玩Rummy(拉米纸牌)的游戏。 7 7 7 7 6 6 6 6 6 6 6 6 7 7 7 7 6 6 6 6 6 6 6 6

  6. 认识堆栈——分析堆栈的逻辑结构 1. 堆栈的定义 • 堆栈(Stack)是一种特殊的线性表,是一种只允许在表的一端进行插入或删除操作的线性表。 • 堆栈就是一个只能访问其末尾数据的数据集,这一端也叫做顶部。 • 数据仅能在顶部进行插入和删除操作。 • 最新插入的数据将被最先删除。 • 因此,堆栈也被称为后进先出数据结构(Last-In-First-Out)。 2. 堆栈的特征 • 堆栈也被称为后进先出数据结构(Last-In-First-Out)。

  7. 认识堆栈——识别堆栈的基本操作 堆栈的基本操作有以下几种: • 初始化栈:也就是产生一个新的空栈; • 入栈操作Push(T x):将指定类型元素x进到栈中; • 出栈操作TPop(): 将栈中的栈顶元素取出来,并在栈中删除栈顶元素; • 取栈顶元素GetTop():将栈中的栈顶元素取出来,栈中元素不变; • 判断栈空IsEmpty():若栈为空,返回true,否则返回false; • 清空操作Clear ( ):从栈中清除所有的数据元素。

  8. 认识堆栈——识别堆栈的基本操作 下面描述堆栈的进栈操作 • PUSH:它是在堆栈顶部插入新元素的过程。 Push an Element 1 Empty Stack 1

  9. 认识堆栈——识别堆栈的基本操作 下面描述堆栈的进栈操作 • PUSH:它是在堆栈顶部插入新元素的过程。 Push an Element 2 Push an Element 3 3 2 1

  10. 认识堆栈——识别堆栈的基本操作 下面描述堆栈的出栈操作 • POP:它是从堆栈顶部删除元素的过程。 POP an Element POP an Element 3 3 2 2 1

  11. 课间思考 • 堆栈中的元素按 ___________基础进行添加和删除。 • 答案: • LIFO

  12. 用顺序栈解决堆栈的编程问题——用顺序栈表示堆栈用顺序栈解决堆栈的编程问题——用顺序栈表示堆栈 • 用一片连续的存储空间来存储栈中的数据元素,这样的栈称为顺序栈(Sequence Stack)。 • 类似于顺序表,用一维数组来存放顺序栈中的数据元素 。 • 栈顶指示器top设在数组下标为0的端,top随着插入和删除而变化,当栈为空时,top=-1 。

  13. 用顺序栈解决堆栈的编程问题——对顺序栈进行操作用顺序栈解决堆栈的编程问题——对顺序栈进行操作 1. 初始化顺序栈 初始化顺序栈就是创建一个空栈,即调用SeqStack<T>的构造函数,在构造函数中执行下面的步骤:

  14. 用顺序栈解决堆栈的编程问题——对顺序栈进行操作用顺序栈解决堆栈的编程问题——对顺序栈进行操作 2.入栈操作:Push(T elem) Push操作是将一个给定的项保存在堆栈的最顶端,顶端元素的索引保存在变量top中,因此要进行Push操作,需要执行下面的步骤:

  15. 用顺序栈解决堆栈的编程问题——对顺序栈进行操作用顺序栈解决堆栈的编程问题——对顺序栈进行操作 3. 出栈操作:T Pop( ) Pop操作就是从堆栈的顶部取出数据。要进行Pop操作,需要执行以下的步骤:

  16. 用顺序栈解决堆栈的编程问题——对顺序栈进行操作用顺序栈解决堆栈的编程问题——对顺序栈进行操作 4. 取栈顶元素:GetTop() 取栈顶元素操作与出栈操作相似,只是取栈顶元素操作不改变原有堆栈,不删除取出的元素。

  17. 用顺序栈解决堆栈的编程问题——用链栈表示堆栈用顺序栈解决堆栈的编程问题——用链栈表示堆栈 • 用链式存储结构存储的栈称为链栈(Linked Stack)。链栈通常用单链表来表示,它的实现是单链表的简化 。 • 链栈结点的结构与单链表结点的结构一样 。 • LinkStack<T>类中有一个字段top表示栈顶指示器和一个字段size表示栈的大小 。

  18. 用顺序栈解决堆栈的编程问题——对顺序栈进行操作用顺序栈解决堆栈的编程问题——对顺序栈进行操作 1. 初始化链栈 初始化链栈就是创建一个空链栈,即调用LinkStack<T>的构造函数,在构造函数中执行下面的步骤:

  19. 用顺序栈解决堆栈的编程问题——对顺序栈进行操作用顺序栈解决堆栈的编程问题——对顺序栈进行操作 2.入栈操作:Push(T elem) Push操作是将一个给定的项保存在堆栈的最顶端,在链栈中,就是在单链表的起始处插入一个结点。需要执行下面的步骤:

  20. 用顺序栈解决堆栈的编程问题——对顺序栈进行操作用顺序栈解决堆栈的编程问题——对顺序栈进行操作 3. 出栈操作:T Pop( ) Pop操作就是从堆栈的顶部取出数据,即从链栈的起始处删除一个结点。要进行Pop操作,需要执行以下的步骤:

  21. 用顺序栈解决堆栈的编程问题——对顺序栈进行操作用顺序栈解决堆栈的编程问题——对顺序栈进行操作 4. 取栈顶元素:GetTop() 取栈顶元素操作与出栈操作相似,只是取栈顶元素操作不改变原有堆栈,不删除取出的元素。

  22. 小结 • 在本章中,你已经学到: • 堆栈(Stack)是一种特殊的线性表,是一种只允许在表的一端进行插入或删除操作的线性表。栈的主要特点是“后进先出”; • 堆栈的插入操作也称为进栈或入栈,堆栈的删除操作称为出栈或退栈; • 允许插入和删除的一端称栈顶(Top),不允许插入和删除的一端称栈底(Bottom); • 堆栈的基本操作; • 顺序栈用一片连续的存储空间来存储栈中的数据元素; • 链栈是用链式存储结构存储的栈。

More Related