栈的基本知识及应用
(完整版)《栈》知识点总结

完整版)《栈》知识点总结1.栈的定义与特点栈是一种具有特定限制的数据结构,遵循“后进先出”(Last-In-First-Out,简称LIFO)的原则。
栈的特点包括:只允许在栈顶进行插入和删除操作;对栈进行插入操作称为入栈或压栈(Push);对栈进行删除操作称为出栈或弹栈(Pop);栈底是栈的最后一个入栈的元素,栈顶是栈的第一个入栈的元素;2.栈的应用领域栈在计算机科学和软件工程中有广泛的应用,常见的应用领域包括:编程语言的解析和编译;递归算法的实现;表达式求值;括号匹配;浏览器的后退和前进功能;操作系统中的函数调用栈等。
3.栈的基本操作栈的基本操作主要包括以下几个方面:初始化栈:创建一个空的栈对象,并指定栈的初始容量;判断栈是否为空:检查栈是否为空,如果栈为空则返回真,否则返回假;入栈操作:将一个元素压入栈顶;出栈操作:从栈顶弹出一个元素,并返回弹出的元素;取栈顶元素:返回栈顶的元素,但不对栈进行修改;___:删除栈中的所有元素。
4.栈的实现方式栈可以通过数组或链表来实现。
使用数组实现的栈称为顺序栈,使用链表实现的栈称为链式栈。
顺序栈通过数组的下标实现栈的操作,其特点是插入和删除操作的时间复杂度为O(1),但需要预先分配一定的内存空间。
链式栈使用链表来存储栈中的数据,插入和删除操作的时间复杂度同样为O(1),不需要预先分配固定大小的空间,但需要额外的空间存储链表节点。
5.栈的复杂度分析栈的复杂度分析主要涉及到栈的各种操作的时间复杂度和空间复杂度。
以下是一些常见操作的复杂度分析:入栈操作的时间复杂度为O(1),空间复杂度为O(1);出栈操作的时间复杂度为O(1),空间复杂度为O(1);取栈顶元素操作的时间复杂度为O(1),空间复杂度为O(1);判断栈是否为空的操作的时间复杂度为O(1),空间复杂度为O(1);清空栈的操作的时间复杂度为O(1),空间复杂度为O(1);初始化栈的操作的时间复杂度为O(1),空间复杂度为O(1);6.总结栈作为一种重要的数据结构,在计算机科学和软件工程中有着广泛的应用。
stack的知识点

stack的知识点1. 栈的定义和特点栈(Stack)是一种具有特殊限制的线性数据结构,它的特点是“后进先出”(Last In First Out,LIFO)。
栈在计算机科学中有着广泛的应用,是一种非常重要的数据结构。
2. 栈的基本操作栈的基本操作包括入栈(push)和出栈(pop)两个操作。
•入栈操作:将元素添加到栈的顶部,使其成为新的栈顶元素。
•出栈操作:移除栈顶的元素,并返回被移除的元素。
除了入栈和出栈操作外,栈还支持其他操作,如获取栈顶元素(top)、判断栈是否为空(empty)、获取栈的大小(size)等。
3. 栈的实现方式栈可以使用数组或链表来实现。
•数组实现:使用数组来存储栈中的元素,通过一个指针来指示栈顶元素的位置。
入栈操作将元素添加到数组的末尾,出栈操作将指针向前移动一位。
•链表实现:使用链表来存储栈中的元素,每个节点包含一个数据元素和一个指向下一个节点的指针。
入栈操作将新元素插入链表的头部,出栈操作将头节点移除。
4. 栈的应用场景栈在计算机科学中有许多应用场景,以下是一些常见的应用场景。
•函数调用栈:在函数调用时,参数、局部变量和返回地址等信息会被压入栈中,函数返回时再从栈中弹出这些信息。
•表达式求值:栈可以用于解析和计算数学表达式,如中缀表达式的转换和后缀表达式的计算。
•括号匹配:栈可以用于检查表达式中的括号是否匹配,如圆括号、方括号和花括号等。
•浏览器的前进和后退功能:浏览器使用栈来记录用户访问的网页历史,通过栈的出栈和入栈操作实现前进和后退功能。
5. 栈的复杂度分析栈的入栈和出栈操作都只涉及到栈顶元素,所以这两个操作的时间复杂度都是O(1)。
而获取栈顶元素、判断栈是否为空和获取栈的大小等操作也都可以在O(1)时间内完成。
6. 总结栈是一种非常重要的数据结构,具有广泛的应用场景。
它的特点是“后进先出”,支持入栈和出栈等基本操作。
栈可以使用数组或链表来实现,常见的应用场景包括函数调用栈、表达式求值、括号匹配和浏览器的前进后退功能等。
计算机栈的知识

计算机栈是一种非常重要的数据结构,它是一种线性数据结构,用于存储和管理一组有序的数据项,这些数据项按照后进先出(LIFO)的原则进行操作。
栈在计算机科学中有着广泛的应用,包括但不限于函数调用栈、表达式求值、数据结构实现等。
栈的基本特性可以概括为“后进先出”(Last In First Out,LIFO)。
这意味着最后进入栈的元素总是第一个被取出。
这种特性使得栈非常适合用于存储一些需要按照特定顺序处理的数据项。
栈的实现通常有两种方式:动态分配和固定数组。
动态分配栈可以动态地根据需要扩展或缩小其容量,而固定数组栈则需要在创建时确定其大小。
栈的基本操作包括:入栈(push)、出栈(pop)和查看栈顶元素(peek)。
入栈操作将一个元素添加到栈顶,而出栈操作则从栈顶移除一个元素。
需要注意的是,出栈操作可能需要一个额外的步骤来确保栈的完整性,例如,如果栈为空,则需要先进行“清空”操作。
查看栈顶元素操作则返回当前位于栈顶的元素。
在计算机科学中,栈的一个重要应用是在函数调用中保存和恢复调用现场信息。
在C语言中,main函数被调用时会创建一个主函数调用栈,该栈包含当前活动的所有函数调用信息,包括函数指针、局部变量等信息。
当一个函数返回时,其局部变量信息会被出栈,新的函数调用会被入栈,形成了一个动态的过程。
此外,栈在算法和数据结构的设计中也扮演着重要的角色。
例如,可以利用栈来实现队列、堆栈、后进先出等数据结构。
在表达式求值中,可以使用栈来保存操作数和操作符,从而实现先乘除后加减的运算规则。
总之,计算机栈是一种非常重要的数据结构,具有后进先出(LIFO)的特性,可以用于存储和管理有序的数据项,实现函数调用、表达式求值、数据结构实现等重要功能。
学习和理解栈的基本概念和操作对于深入理解计算机科学和编程技术是非常重要的。
数据结构--栈和队列基础知识

数据结构--栈和队列基础知识⼀概述栈和队列,严格意义上来说,也属于线性表,因为它们也都⽤于存储逻辑关系为 "⼀对⼀" 的数据,但由于它们⽐较特殊,因此将其单独作为⼀篇⽂章,做重点讲解。
既然栈和队列都属于线性表,根据线性表分为顺序表和链表的特点,栈也可分为顺序栈和链表,队列也分为顺序队列和链队列,这些内容都会在本章做详细讲解。
使⽤栈结构存储数据,讲究“先进后出”,即最先进栈的数据,最后出栈;使⽤队列存储数据,讲究 "先进先出",即最先进队列的数据,也最先出队列。
⼆栈2.1 栈的基本概念同顺序表和链表⼀样,栈也是⽤来存储逻辑关系为 "⼀对⼀" 数据的线性存储结构,如下图所⽰。
从上图我们看到,栈存储结构与之前所了解的线性存储结构有所差异,这缘于栈对数据 "存" 和 "取" 的过程有特殊的要求:1. 栈只能从表的⼀端存取数据,另⼀端是封闭的;2. 在栈中,⽆论是存数据还是取数据,都必须遵循"先进后出"的原则,即最先进栈的元素最后出栈。
拿图 1 的栈来说,从图中数据的存储状态可判断出,元素 1 是最先进的栈。
因此,当需要从栈中取出元素 1 时,根据"先进后出"的原则,需提前将元素 3 和元素 2 从栈中取出,然后才能成功取出元素 1。
因此,我们可以给栈下⼀个定义,即栈是⼀种只能从表的⼀端存取数据且遵循 "先进后出" 原则的线性存储结构。
通常,栈的开⼝端被称为栈顶;相应地,封⼝端被称为栈底。
因此,栈顶元素指的就是距离栈顶最近的元素,拿下图中的栈顶元素为元素 4;同理,栈底元素指的是位于栈最底部的元素,下中的栈底元素为元素 1。
2.2 进栈和出栈基于栈结构的特点,在实际应⽤中,通常只会对栈执⾏以下两种操作:向栈中添加元素,此过程被称为"进栈"(⼊栈或压栈);从栈中提取出指定元素,此过程被称为"出栈"(或弹栈);2.3 栈的具体实现栈是⼀种 "特殊" 的线性存储结构,因此栈的具体实现有以下两种⽅式:1. 顺序栈:采⽤顺序存储结构可以模拟栈存储数据的特点,从⽽实现栈存储结构。
3.3.2栈的应用教学设计

在学习“3.3.2栈的应用”过程中,学生将通过以下方法和过程来达成学习目标:
1.探究学习:通过小组讨论、自主探究,发现并理解栈的特性及其在解决实际问题中的应用。
-教师组织课堂活动,引导学生主动探索,培养其发现问题和解决问题的能力。
2.案例分析:分析栈在解决实际问题中的典型应用,提炼出算法设计的通用方法和步骤。
(二)讲授新知
在讲授新知环节,教师按照以下步骤进行:
1.理论讲解:详细讲解பைடு நூலகம்的基本概念、特性以及在实际问题中的应用场景,如括号匹配、路径问题等。
2.算法分析:通过分析表达式求值、括号匹配等案例,讲解栈在算法设计中的关键作用,引导学生理解算法的步骤和原理。
3.代码演示:以编程语言为例,现场演示栈的实现及在表达式求值中的应用,让学生了解栈的具体操作过程。
在总结归纳环节,教师引导学生进行以下总结:
1.栈的基本概念和特性:回顾栈的定义、特点以及在实际问题中的应用。
2.栈的算法设计:总结栈在解决实际问题中的关键步骤和方法。
3.编程实践:强调编程实践中的注意事项,如代码规范、调试技巧等。
4.团队协作:强调团队协作在解决问题中的重要性,鼓励学生在今后的学习中积极参与合作。
-此作业旨在激发学生的探究兴趣,培养其创新思维和解决实际问题的能力。
4.小组合作项目:以小组为单位,共同完成一个基于栈的应用项目。项目主题自选,可以是游戏、工具软件或任何能够体现栈特性的应用。
-通过小组合作,学生可以锻炼团队协作能力,同时在实际项目中进一步掌握栈的使用。
5.课后反思:请学生结合课堂学习和作业完成情况,撰写一份课后反思,内容包括自己在学习栈的过程中遇到的困难、解决问题的方法、对栈的理解和感受,以及对未来学习的规划。
信息学奥赛知识点(十二)—栈和队列

栈和队列是信息学竞赛中经常涉及的数据结构,它们在算法和程序设计中有着广泛的应用。
掌握栈和队列的基本原理和操作方法,对于参加信息学竞赛的同学来说是非常重要的。
本文将深入探讨栈和队列的相关知识点,帮助大家更好地理解和掌握这两种数据结构。
一、栈的定义与特点栈是一种先进后出(LIFO)的数据结构,它的特点是只允许在栈顶进行插入和删除操作。
栈可以用数组或链表来实现,常见的操作包括压栈(push)、出栈(pop)、获取栈顶元素(top)等。
栈的应用非常广泛,比如在计算机程序中,函数的调用和返回值的存储就是通过栈来实现的。
二、栈的基本操作1. 压栈(push):将元素压入栈顶2. 出栈(pop):将栈顶元素弹出3. 获取栈顶元素(top):返回栈顶元素的值,但不把它从栈中移除4. 判空:判断栈是否为空5. 获取栈的大小:返回栈中元素的个数三、栈的应用1. 括号匹配:利用栈来检查表达式中的括号是否匹配2. 表达式求值:利用栈来实现中缀表达式转换为后缀表达式,并进行求值3. 迷宫求解:利用栈来实现迷宫的路径搜索4. 回溯算法:在深度优先搜索和递归算法中,通常会用到栈来保存状态信息四、队列的定义与特点队列是一种先进先出(FIFO)的数据结构,它的特点是只允许在队尾进行插入操作,在队首进行删除操作。
队列同样可以用数组或链表来实现,常见的操作包括入队(enqueue)、出队(dequeue)、获取队首元素(front)、获取队尾元素(rear)等。
队列在计算机领域也有着广泛的应用,比如线程池、消息队列等都可以用队列来实现。
五、队列的基本操作1. 入队(enqueue):将元素插入到队列的末尾2. 出队(dequeue):从队列的头部删除一个元素3. 获取队首元素(front):返回队列的头部元素的值4. 获取队尾元素(rear):返回队列的尾部元素的值5. 判空:判断队列是否为空6. 获取队列的大小:返回队列中元素的个数六、队列的应用1. 广度优先搜索算法(BFS):在图的搜索中,通常会用队列来实现BFS算法2. 线程池:利用队列来实现任务的调度3. 消息队列:在分布式系统中,常常会用队列来进行消息的传递4. 最近最少使用(LRU)缓存算法:利用队列实现LRU缓存淘汰在信息学竞赛中,栈和队列的相关题目经常出现,并且有一定的难度。
组合结构知识点总结

组合结构知识点总结组合结构是一种常见的数据结构,通过将数据元素组合成不同的方式,可以满足不同的需求。
在计算机科学和软件工程中,组合结构有着广泛的应用,例如树、图、堆栈、队列等。
本文将对组合结构的基本概念、特点、常见应用以及相关算法进行总结,以便读者更好地理解和应用组合结构。
一、组合结构的基本概念1. 组合结构是由多个数据元素组合而成的一种数据结构。
这些数据元素可以具有不同的类型和关系,通过组合可以形成各种不同的结构和形式。
2. 组合结构可以在不同的层次上进行组合,例如可以将多个元素组合成一个集合,或者将多个集合组合成一个更大的结构。
这种层次化的组合结构使得数据可以更加灵活地表达和使用。
3. 组合结构通过各种不同的方式进行组合,例如可以使用链表、数组、树、图等不同的结构来进行组合。
这些不同的组合方式可以满足不同的需求,使得组合结构具有更加灵活和多样化的特点。
二、组合结构的特点1. 灵活性:组合结构可以通过不同的方式进行组合,可以形成各种不同的结构和形式。
这种灵活性使得组合结构适用于不同的应用场景,可以满足不同的需求。
2. 层次性:组合结构可以在不同的层次上进行组合,例如可以将多个元素组合成一个集合,或者将多个集合组合成一个更大的结构。
这种层次化的组合结构使得数据可以更加灵活地表达和使用。
3. 多样性:组合结构可以使用各种不同的方式进行组合,例如可以使用链表、数组、树、图等不同的结构来进行组合。
这种多样性使得组合结构具有更加灵活和多样化的特点。
4. 效率性:组合结构可以通过一些高效的算法和数据结构来实现,使得组合结构具有较高的效率。
例如可以使用平衡二叉树来实现集合的操作,使得集合的查找、插入和删除等操作具有较高的效率。
三、组合结构的常见应用1. 集合:集合是一种最常见的组合结构,可以用来表示不重复元素的集合。
集合可以通过各种不同的方式进行实现,例如可以使用数组、链表、树等不同的数据结构来表示集合。
2. 栈:栈是一种后进先出(LIFO)的组合结构,可以用来表示具有顺序关系的数据元素。
zstack协议栈知识点总结

zstack协议栈知识点总结1. Z-Stack 协议栈架构Z-Stack 协议栈的架构分为四个层次:应用层、安全层、网络层和 MAC 层。
- 应用层:提供应用程序接口,实现应用层协议的处理和应用功能的实现。
- 安全层:实现对数据的加密和认证,确保通信的安全性。
- 网络层:实现 ZIGBEE 网络节点的加入、路由和寻径功能。
- MAC 层:实现对无线通信介质的访问和管理,包括 CSMA/CA 协议、ACK 确认和重传机制等。
2. Z-Stack 协议栈特点Z-Stack 协议栈具有以下几个特点:- 符合 ZigBee 标准:Z-Stack 协议栈严格遵循 ZigBee 标准,保证了与其他 ZigBee 设备的兼容性。
- 易用性:Z-Stack 提供了丰富的开发工具和示例代码,开发者可以快速上手进行开发。
- 灵活性:Z-Stack 支持不同的硬件平台和操作系统,适用于各种嵌入式系统。
- 安全性:Z-Stack 提供了多种安全机制,包括 AES 加密、认证和密钥管理,保证了通信的安全性。
3. Z-Stack 协议栈功能Z-Stack 协议栈实现了 ZigBee 协议的各种功能,包括网络组建、路由管理、数据传输和安全保障等。
- 网络组建:Z-Stack 支持 ZigBee 网络的组建和维护,包括协调器、路由器和终端设备的加入和退出。
- 路由管理:Z-Stack 负责 ZigBee 网络中的路由选择和寻径功能,保证数据的可靠传输。
- 数据传输:Z-Stack 实现了数据的传输和协议控制,包括数据帧封装、数据确认和重传机制。
- 安全保障:Z-Stack 提供了数据的加密、认证和密钥管理功能,保证通信的安全性。
4. Z-Stack 协议栈应用Z-Stack 协议栈广泛应用于物联网、智能家居、工业控制和传感器网络等领域,实现设备之间的无线通信和数据交换。
- 物联网应用:Z-Stack 协议栈可以用于连接各种传感器、执行器和控制器,构建物联网设备之间的通信网。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
栈的基本知识及应用1.栈的概念和特性栈(stack)是一种特殊的线性表。
作为一个简单的例子,可以把食堂里冼净的一摞碗看作一个栈。
在通常情况下,最先冼净的碗总是放在最底下,后冼净的碗总是摞在最顶上。
而在使用时,却是从顶上拿取,也就是说,后冼的先取用,后摞上的先取用。
好果我们把冼净的碗“摞上”称为进栈(压栈),把“取用碗”称为出栈(弹出),那么,上例的特点是:后进栈的先出栈。
然而,摞起来的碗实际上是一个表,只不过“进栈”和“出栈”都在最顶上进行,或者说,元素的插入和删除是在表的一端进行而已。
一般而言,栈是一个线性表,其所有的插入和删除均是限定在表的一端进行,允许插入和删除的一端称栈顶(Top),不允许插入和删除的一端称栈底(Bottom)。
若给定一个栈S=(a, a2,a3,…,a n),则称a1为栈底元素,a n为栈顶元素,元素a i位于元素a i-1之上。
栈中元1素按a1, a2,a3,…,a n的次序进栈,如果从这个栈中取出所有的元素,则出栈次序为a n, a n-1,…,a1。
也就是说,栈中元素的进出是按后进先出的原则进行,这是栈结构的重要特征。
因此栈又称为后进先出(LIFO—Last In First Out)表。
我们常用一个图来形象地表示栈,其形式如下图:通常,对栈进行的运算主要有以下几种:⑴在使用栈之前,首先需要建立一个空栈,称建栈;⑵往栈顶加入一个新元素,称进栈(压栈);⑶删除栈顶元素,称出栈(退栈、弹出);⑷查看当前的栈顶元素,称读栈;{注意与⑶的区别}⑸在使用栈的过程中,还要不断测试栈是否为空或已满,称为测试栈。
2.栈的存储结构栈是一种线性表,在计算机中用向量作为栈的存储结构最为简单。
因此,当用编程语言写程序时,用一维数组来建栈十分方便。
例如,设一维数组STACK[1..n] 表示一个栈,其中n为栈的容量,即可存放元素的最大个数。
栈的第一个元素,或称栈底元素,是存放在S TACK[1]处,第二个元素存放在STACK[2]处,第i个元素存放在STACK[i]处。
另外,由于栈顶元素经常变动,需要设置一个指针变量top,用来指示栈顶当前位置,栈中没有元素即栈空时,令top=0,当top=n时,表示栈满。
如果一个栈已经为空,但用户还继续做出栈(读栈)操作,则会出现栈的“下溢”;如果一个栈已经满了,用户还继续做进栈操作,则会出现栈的“上溢”。
两种情况统称为栈的溢出。
3.对栈的几种运算的实现方法:(1)建栈这比较简单,只要建立一个一维数组,再把栈顶指针置为零。
栈的容量根据具体的应用要求而定。
比如:type arraytype= array[1.. n] of integer;var stack:arraytype;top:integer;再在程序开始时,置top:=0;(2)测试栈测试栈顶指针的值,若top=0,则栈空;若top=n,则栈满。
(3)读栈若top=0,则栈空,无栈顶元素可读,出错;若top<>0,则回送栈顶元素的值STACK[t op]。
(4)进栈(push)将栈顶指针加1后,再把新元素送到栈顶。
假设新元素x为整型,栈的最大深度为n,x和n设置为值型参。
而栈和栈顶指针要设置成变量型参。
procedure push(var stack:arraytype;var top:integer;n:integer;x:integer);beginif top=nthen b egin writeln(…Stack full!‟); halt endelse begin top:=top+1; stack[top]:= x endend;(5)退栈(pop)取得栈顶元素的值后,再把栈顶指针top减1。
注意都用变量型参。
procedure pop(var stack:arraytype;var top:integer;var x:integer);beginif top=0then beg in writeln(…Stack empty!‟); halt endelse begin x:=stack[top]; top:=top-1 endend;注意:由于栈本身和栈顶指针是密不可分的,所以有时我们把他们定义成一个记录来处理。
如:type stack=recordvec:array[1..n] of integer; {n为栈可达到的最大深度}top:integer;end;则以上几种运算的实现只要稍做修改即可。
procedure push(var s:stack;x:integer);beginif s.top=nthen begin writeln(…Stack full!‟); halt endelse begin s.top:=s.top+1; s.vec[s.top]:= x endend;procedure pop(var s:stack;var x:integer);beginif s.top=0then begin writeln(…Stack empty!‟); halt endelse begin x:=s.vec[s.top]; s.top:=s.top-1 endend;出栈有时也可用函数实现,如:function pop(var s:stack):integer;beginif s.top=0then begin writeln(…Stack empty!‟); halt endelse begin pop:=s.vec[s.top]; s.top:=s.top-1 endend;栈在计算机科学领域有着广泛的应用。
比如在编译和运行计算机程序的过程中,就需要用栈进行语法检查(如检查begin和end、“(”和“)”等是否匹配)、计算表达式的值、实现过程和函数的递归调用等。
下面举例说明栈在这些方面的应用。
例1、假设一个表达式有英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。
请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则返回“NO”。
表达式长度小于255,左圆括号少于20个。
分析:假设输入的字符串存储在c中(var c:string[255])。
我们可以定义一个栈:var s:array[1..maxn] of char;top:integer;用它来存放表达式中从左往右的左圆括号。
算法的思路为:顺序(从左往右)扫描表达式的每个字符c[i],若是“(”,则让它进栈;若遇到的是“)”,则让栈顶元素出栈;当栈发生下溢或当表达式处理完毕而栈非空时,表示不匹配,返回“YES”,否则表示匹配返回“NO”。
程序代码如下:var c:string;function doit(c:string):boolean;var s:array[1..20] of char;top,i:integer;ch:char;begintop:=0;i:=1;ch:=c[i];while ch<>'@' dobeginif (ch='(') or (ch=')') thencase ch of'(':begin top:=top+1;s[top]:='(' end;')':if top>0 then top:=top-1else begin doit:=false;exit end;end;i:=i+1;ch:=c[i];end;if top=0 then doit:=trueelse doit:=false;end;beginassign(input,'in.txt');reset(input);readln(c);writeln(doit(c));close(input);end.2、背包问题问题:假设有n件质量分配为w1,w2,...,w n的物品和一个最多能装载总质量为T的背包,能否从这n件物品中选择若干件物品装入背包,使得被选物品的总质量恰好等于背包所能装载的最大质量,即w i1+w i2+...+w ik=T。
若能,则背包问题有解,否则无解。
算法思想:首先将n件物品排成一列,依次选取;若装入某件物品后,背包内物品的总质量不超过背包最大装载质量时,则装入(进栈);否则放弃这件物品的选择,选择下一件物品试探,直至装入的物品总和正好是背包的最大转载质量为止。
这时我们称背包装满。
若装入若干物品的背包没有满,而且又无其他物品可以选入背包,说明已装入背包的物品中有不合格者,需从背包中取出最后装入的物品(退栈),然后在未装入的物品中挑选,重复此过程,直至装满背包(有解),或无物品可选(无解)为止。
具体实现:设用数组weight[1..N],stack[1,N]分别存放物品重量和已经装入背包(栈)的物品序号,MaxW表示背包的最大装载量。
每进栈一个物品,就从MaxW中减去该物品的质量,设i为待选物品序号,若MaxW-weight[i]>=0,则该物品可选;若MaxW-weight[i] < 0,则该物品不可选,且若i>n,则需退栈,若此时栈空,则说明无解。
(本题作为课后作业,具体程序请大家自行完成)[栈的应用举例]1、若已知一个栈的入栈顺序是1,2,3,…,n,其输出序列为P1,P2,P3,…,Pn,若P 1是n,则Pi是( )。
A)i B)n-1 C)n-i+1 D)不确定2、以下哪一个不是栈的基本运算( )。
A)删除栈顶元素B)删除栈底的元素C)判断栈是否为空D)将栈置为空栈3、设栈S和队列Q初始状态为空,元素e 1 ,e 2 ,e 3 ,e 4 ,e 5 ,e 6依次通过栈S,一个元素出栈后即进入队列Q,若出队的顺序为e 2 ,e 4 ,e 3 ,e 6 ,e 5 ,e 1 ,则栈S的容量至少应该为()。
A)2 B)3 C)4 D)54、设栈S的初始状态为空,现有5个元素组成的序列{1,2,3,4,5},对该序列在S 栈上依次进行如下操作(从序列中的1开始,出栈后不在进栈):进栈,进栈,进栈,出栈,进栈,出栈,进栈,问出栈的元素序列是:_________,栈顶指针的值为______,栈顶元素为:___________________。
5、设栈S和队列Q初始状态为空,元素e 1 ,e 2 ,e 3 ,e 4 ,e 5 ,e 6依次通过栈S,一个元素出栈后即进入队列Q,若出队顺序为e 2 ,e 4 ,e 3 ,e 6 ,e 5 ,e 1 ,则栈S的容量至少应该为______________。
6、如下图,有一个无穷大的的栈S,在栈的右边排列着1,2,3,4,5共五个车厢。