栈总结

合集下载

(完整版)《栈》知识点总结

(完整版)《栈》知识点总结

完整版)《栈》知识点总结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.总结栈作为一种重要的数据结构,在计算机科学和软件工程中有着广泛的应用。

栈实验心得优秀5篇

栈实验心得优秀5篇

栈实验心得优秀5篇(实用版)编制人:__________________审核人:__________________审批人:__________________编制单位:__________________编制时间:____年____月____日序言下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。

文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!并且,本店铺为大家提供各种类型的实用资料,如工作总结、工作报告、工作计划、心得体会、讲话致辞、教育教学、书信文档、述职报告、作文大全、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor.I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you!Moreover, our store provides various types of practical materials for everyone, such as work summaries, work reports, work plans, reflections, speeches, education and teaching, letter documents, job reports, essay summaries, and other materials. If you want to learn about different data formats and writing methods, please stay tuned!栈实验心得优秀5篇对于心得体会,我们可以全面地透露本质的看法,心得体会是我们在实践中的收获,下面是本店铺为您分享的栈实验心得优秀5篇,感谢您的参阅。

数据结构栈实验报告总结

数据结构栈实验报告总结

数据结构栈实验报告总结数据结构栈实验是一个比较复杂的过程,对于我来说,这也是一个很大的挑战。

因为这个实验是我设计和实现数据结构栈的一个过程。

数据结构栈是一个由复杂程序模块构成的。

它是一个能把抽象出来的抽象程序逻辑表象转化为一个简单方便的实际程序代码块的过程。

它还是一个数据结构和数据包分离的过程。

比如把数据包放到单独的文件夹里,然后用不同的方法把数据包从文件夹中提取出来进行封装;把数据包放到同一个文件夹中,再把数据包放回数据包里等。

最后将结果应用到实际工作中,再修改。

一、建立一个复杂的数据结构栈首先我们要明确一件事,我们所学的专业的编程语言在一般情况下是比较难解决这些问题的。

所以,我们要想能够很好地解决这些问题,就必须有一个强大的工具来帮助我们解决问题。

为了建立一个强大的工具,我们需要将编程语言中抽象出来的程序逻辑表象转换成一个简单方便,使用的程序代码块。

这样就可以很好地解决这些问题。

为了能帮助我们建立起复杂体系结构,我们需要建立一个文件模型,一般都是包含很多个抽象关系式,而我们只有知道这些结构,才能将这些抽象关系式转化为一个简单易用的代码块。

然后,我们把这个抽象程序模型封装在文件夹里后再用一些方法提取出一个实例化数据结构,并且可以通过实验来验证自己设计代码时对复杂度的一个把握。

所以我们需要建立一种完善的软件系统来解决以上问题。

另外,我们还需要用到一些简单易学但是又要复杂度很高的方法来提高自己制作模型的速度。

二、数据结构栈的原理一般地说,要实现一个软件系统,需要解决两个重要的问题:一是如何将抽象出的各种事物的逻辑表象转化为一个简单方便的实际程序代码块;二是如何将程序中那些简单的抽象事物转化为一些具有较高复杂度的实际程序代码块。

这些问题都要求我们设计一个程序结构,即用程序来处理抽象出来的问题。

因此,研究一种能把抽象出来的思想表象转化为易于操作的实际程序代码块(又称代码块)的方法是很有意义的。

首先,我们要知道计算机中的实际程序是用来执行程序设计上一些逻辑复杂且数量庞大的内容。

LTE空口协议栈总结

LTE空口协议栈总结

MAC协议1.功能1.1逻辑信道和传输信道的映射1.2复用一条或多条逻辑信道下来的数据(MAC SDUs)到传输块,并通过传输信道发送到物理层1.3把从传输信道发来的数据解复用成MAC SDU,并通过相应的逻辑信道发送到RLC层1.4调度信息报告,UE向NODEB请求传输资源1.5通过动态调度的方式,处理不同用户的优先级,以及同一用户的不同逻辑信道的优先级处理,主要在UE端实现。

1.6传输格式的选择,通过物理层上报的测量信息,用户能力,选择相应的传输格式,从而达到有效的资源利用。

MAC层在协议栈中的位置:MAC所处理的传输信道包括:广播信道(BCH)寻呼信道(PCH)随机接入信道(RACH)上行共享信道(UL-SCH)下行共享信道(DL-SCH)其实这些传输信道只是概念上的,因为传输信道在管理上不像逻辑信道有专门的信道号,它只是从功能上进行了描述,因此在实现上是否有这样的信道要取决于厂家自己。

对与MAC层和物理层之间的传输,也可以设置专门的通道,也可以通过一些简单的标识来处理,这只是信道的一种表现形式。

2.信道概念信道可以认为是不同协议层之间的业务接入点(SAP),是下一层向它的上一层提供的服务。

LTE沿用了UMTS里面的三种信道:逻辑信道,传输信道和物理信道。

2.1信道的用途及格式1)传输信道BCH广播信道:下行,固定的预定义传输格式,如有固定大小,固定发送周期,固定的调制编码方式等。

PCH寻呼信道:下行,支持UE的非连续接收达到省电的目的,RACH随机接入信道:上行,用于指定传输随机接入前导,发射功率等信息。

DL-SCH/UL-SCH共享信道:用于传输业务数据和系统控制消息。

2)逻辑信道BCCH广播控制信道:下行信道,用于广播系统控制信息,例如信道带宽,天线个数及各种信道的配置参数。

PCCH呼叫控制信道:下行信道,用于传输呼叫信息。

CCCH通用控制信道:下行信道,用于传递UE和系统间的控制信息。

木栈道工作总结

木栈道工作总结

木栈道工作总结
木栈道工作总结是对木栈道工作进行全面梳理和总结的过程。

木栈道工作是一
项重要的工作,它不仅是对木栈道进行维护和管理,更是对环境保护和旅游业的重要支持。

在过去的一段时间里,我们团队在木栈道工作中取得了一些成绩,也遇到了一些困难和挑战。

因此,对木栈道工作进行总结,可以帮助我们更好地发现问题,总结经验,为今后的工作提供参考和借鉴。

首先,我们对木栈道的维护和管理工作进行了全面的梳理和总结。

在过去的一
段时间里,我们团队对木栈道进行了多次巡查和维护,及时发现并解决了一些问题,确保了木栈道的安全和舒适。

同时,我们也对木栈道的使用情况进行了统计和分析,为今后的工作提供了参考。

其次,我们对木栈道工作中遇到的困难和挑战进行了总结。

在木栈道工作中,
我们遇到了一些困难和挑战,比如天气变化、游客管理等问题。

通过总结这些困难和挑战,我们发现了一些问题的根源,并提出了一些解决方案,为今后的工作提供了参考和借鉴。

最后,我们对木栈道工作中的经验和教训进行了总结。

在过去的一段时间里,
我们团队积累了一些宝贵的经验和教训,比如团队合作、安全管理等方面。

通过总结这些经验和教训,我们可以更好地发现问题,总结经验,为今后的工作提供参考和借鉴。

总的来说,木栈道工作总结是一项重要的工作,它可以帮助我们更好地发现问题,总结经验,为今后的工作提供参考和借鉴。

通过总结木栈道工作,我们可以更好地发现问题,总结经验,为今后的工作提供参考和借鉴。

希望在未来的工作中,我们可以继续努力,不断提高木栈道工作的质量和水平。

栈队实验总结(合集7篇)

栈队实验总结(合集7篇)

这次实习,我对该公司的一些情况有了一个基本的了解,根据在实习期间的所见,我对公司的今后发展提出了以下的建议:1、公司成立不久,应加大宣传力度,让更多的老百姓都知道有“鸿源”这个牌子,更知道这个牌子的产品是做何用途的,这样公司的业务面才会越扩越大。

2、公司的财务体系还不是很完善,财务人员的素质还有待于进一步提高。

在所有的凭证中,仓库人员只核算材料数量,而没有接触金额的核算。

金额的核算一般由财务室来完成,这与我们所学到的凭证做法有一定的出入。

3、在管理制度上,应该建立奖惩分明制度,在我实习期间,让我感觉最明显的就是在管理体制上,制度不明确,赏罚不分明,这样不能够调动员工的积极性,从而降低生产量,减少利润。

4、在今后的公司发展上,应注重规模效应,培养团队精神。

就该公司的目前情况来看,规模还仅限于小机械、分工作业式,还没有形成一定的规模。

再一点,各部门的协作能力不是很好,还没有培养出一种团队精神。

实习真的是一种经历,只有亲身体验才知其中滋味。

课本上学的知识都是最基本的知识,不管现实情况怎样变化,抓住了最基本的就可以以不变应万变。

如今有不少学生实习时都觉得课堂上学的知识用不上,出现挫折感,但我觉得,要是没有书本知识作铺垫,又哪能应付这瞬息万变的社会呢?经过这次实习,虽然时间很短。

可我学到的却是我四年大学中难以学习到的。

就像如何与同事们相处,相信人际关系是现今不少大学生刚踏出社会遇到的一大难题,于是在实习时我便有意观察前辈们是如何和同事以及上级相处的,而自己也尽量虚心求教,不耻下问。

要搞好人际关系并不仅仅限于本部门,还要跟别的部门例如市场部等其他部的同事相处好,那样工作起来的效率才会更高,人们所说的“和气生财”在我们的.日常工作中也是不无道理的。

而且在工作中常与前辈们聊聊天不仅可以放松一下神经,而且可以学到不少工作以外的事情,尽管许多情况我们不一定能遇到,可有所了解做到心中有数,也算是此次实习的目的了。

会计本来就是烦琐的工作。

栈和队列总结

栈和队列总结栈和队列啊,这俩东西就像我村里的两家子人。

栈呢,就像是那种一根筋的老赵家。

老赵家做事儿啊,特别轴,东西只能一个一个往上摞,就像栈的操作,先进去的得最后出来。

我就记得有一次,老赵家堆柴火,那柴火啊,一根一根往上堆得可整齐了,就像栈里的数据元素。

他家大儿子先把柴火一根根递上去,结果最后要拿的时候,小儿子在底下干着急,非得等上面的都拿完了,他才能拿到最开始大哥放的那根柴火。

这老赵家啊,就是这么个脾气,按照自己的规矩来,谁也改不了。

再说那队列,这就像村东头的老孙家。

老孙家人口多,出门啊,总是排着队,规规矩矩的。

先出去的就先办完事,不像老赵家那么拧巴。

有一回村里发救济粮,老孙家的人啊,从老到小,一个跟着一个在村部外面排队。

老孙家的老爷子走在最前面,第一个领到了粮食,开开心心就回家了。

后面的人也不着急,就按照这个顺序来。

这队列就跟老孙家一样,有条不紊的。

我就想啊,这栈和队列在计算机里也是这个理儿。

栈在程序里就像是在处理那些有先后顺序,但是又得倒着来的事情。

比如说函数调用,一个函数调用另一个函数,就像老赵家的柴火堆,得一层一层地往上,最后再一层一层地下来。

这时候要是乱了顺序啊,那就跟老赵家的柴火堆倒了一样,乱成一团麻。

队列呢,在计算机里就像是处理那些先来先服务的任务。

就像老孙家领救济粮,谁先来的谁先得服务。

比如说打印机排队打印文件,第一个发送打印任务的就第一个被打印,大家都按照这个顺序来,也不吵也不闹。

我有时候就琢磨啊,这计算机里的东西啊,和咱村里的生活还真有点像。

这栈和队列啊,虽然看着简单,可里面的门道还真不少。

就像村里的每家每户,表面上看着都是过日子,可每家都有每家的过法儿,这栈和队列也是,各有各的用途,谁也替代不了谁。

关于数据结构栈实验报告总结与心得

关于数据结构栈实验报告总结与心得关于数据结构栈实验报告总结与心得1做了一个星期的程序设计终于做完了,在这次程序设计课中,真是让我获益匪浅,我突然发现写程序还挺有意思的。

由于上学期的c语言跟这学期的数据结构都算不上真正的懂,对于书上的稍微难点的知识就是是而非的,所以我只是对老师的程序理解,我也试着去改变了一些变量,自己也尽量多的去理解老师做程序的思路。

当我第一天坐在那里的时候,我就不知道该做些什么,后来我只有下来自己看了一遍书来熟悉下以前学过的知识。

通过这次的程序设计,发现一个程序设计就是算法与数据结构的结合体,自己也开始对程序产生了前所未有的兴趣,以前偷工减料的学习也不可能一下子写出一个程序出来,于是我就认真看老师写的程序,发现我们看懂了一个程序其实不难,难的是对于一个程序的思想的理解,我们要掌握一个算法,不仅仅限于读懂,主要的是要理解老师的思路,学习老师的解决问题的方法。

这次试验中,我发现书本上的知识是一个基础,但是我基础都没掌握,更别说写出一个整整的.程序了。

自己在写程序的时候,也发现自己的知识太少了,特别是基础知识很多都是模模糊糊的一个概念,没有落实到真正的程序,所以自己写的时候也感到万分痛苦,基本上涉及一个知识我就会去看看书,对于书本上的知识没掌握好。

在饭后闲暇时间我也总结了一下,自己以前上课也认真的听了,但是还是写不出来,这主要归结于自己的练习太少了,而且也总是半懂就不管了。

在改写老师的程序中也出现了很多的问题,不断的修改就是不断的学习过程,当我们全身心的投入其中时,实际上是一件很有乐趣的事情。

对于以后的学习有了几点总结:第一、熟记各种数据结构类型,定义、特点、基本运算(分开点一点也没多少东西,难度不大,但是基本);第二、各种常用的排序算法,如冒泡排序、堆排序……,这些是必考的内容,分数不会少于20%;第三,多做习题,看题型,针对题型来有选择复习;数据结构看上去很复杂,但你静下心来把书扫上几遍,分解各个知识点,这一下来,学数据结构的思路就会很清晰了。

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 协议栈可以用于连接各种传感器、执行器和控制器,构建物联网设备之间的通信网。

栈与队列实验报告总结

栈与队列实验报告总结实验报告总结:栈与队列一、实验目的本次实验旨在深入理解栈(Stack)和队列(Queue)这两种基本的数据结构,并掌握其基本操作。

通过实验,我们希望提高自身的编程能力和对数据结构的认识。

二、实验内容1.栈的实现:我们首先使用Python语言实现了一个简单的栈。

栈是一种后进先出(LIFO)的数据结构,支持元素的插入和删除操作。

在本次实验中,我们实现了两个基本的栈操作:push(插入元素)和pop(删除元素)。

2.队列的实现:然后,我们实现了一个简单的队列。

队列是一种先进先出(FIFO)的数据结构,支持元素的插入和删除操作。

在本次实验中,我们实现了两个基本的队列操作:enqueue(在队尾插入元素)和dequeue(从队头删除元素)。

3.栈与队列的应用:最后,我们使用所实现的栈和队列来解决一些实际问题。

例如,我们使用栈来实现一个算术表达式的求值,使用队列来实现一个简单的文本行编辑器。

三、实验过程与问题解决在实现栈和队列的过程中,我们遇到了一些问题。

例如,在实现栈的过程中,我们遇到了一个“空栈”的错误。

经过仔细检查,我们发现是因为在创建栈的过程中没有正确初始化栈的元素列表。

通过添加一个简单的初始化函数,我们解决了这个问题。

在实现队列的过程中,我们遇到了一个“队列溢出”的问题。

这是因为在实现队列时,我们没有考虑到队列的容量限制。

通过添加一个检查队列长度的条件语句,我们避免了这个问题。

四、实验总结与反思通过本次实验,我们对栈和队列这两种基本的数据结构有了更深入的理解。

我们掌握了如何使用Python语言实现这两种数据结构,并了解了它们的基本操作和实际应用。

在实现栈和队列的过程中,我们也学到了很多关于编程的技巧和方法。

例如,如何调试代码、如何设计数据结构、如何优化算法等。

这些技巧和方法将对我们今后的学习和工作产生积极的影响。

然而,在实验过程中我们也发现了一些不足之处。

例如,在实现栈和队列时,我们没有考虑到异常处理和性能优化等方面的问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

栈及其使用一、栈及其特点栈(Stack)是限制在表的一端进行插入和删除运算的线性表,通常称插入、删除的这一端为栈顶(Top),另一端为栈底(Bottom).当表中没有元素时称为空栈。

假设栈S=(a1,a2,a3,…aN),则a1称为栈底元素,aN为栈顶元素。

栈中元素按a1,a2,a3,…,aN的次序进栈,退栈的第一个元素应为栈顶元素。

换句话说,栈的修改是按后进先出的原则进行的。

因此,栈称为后进先出表(LIFO)。

栈顶(top):允许插入和删除的一端;栈顶的当前位置由栈顶指针指示。

栈底(bottom):不允许插入和删除的一端。

进栈或入栈:栈的插入操作。

出栈或退栈:栈的删除操作。

空栈:没有元素的栈。

二、栈的基本操作initStack() 初始化操作,建立一个空栈SisEmpty() 判空栈操作,若为空栈,返回一个真值isFull() 判满栈操作,若为满栈,返回一个真值push(x) 进栈操作,在S栈顶插入一个元素xpop() 出栈操作,若栈S不为空,在栈顶删除一个元素。

peek() 取栈顶元素操作,若S不空,则取栈顶元素(不删除)三、栈的存储结构3.1顺序栈利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,一般用一维数组表示;需要附设一个位置指针top(栈顶指针)来动态地指示栈顶元素在顺序栈中的位置3.2链栈采用链表作为存储结构实现;必须设置一个栈顶指针永远指向栈顶四、顺序栈定义类StackS表示顺序栈,其中使用数组stackArray来表示栈,通过属性maxSize指定数组长度;定义变量top表示栈顶指针。

代码如下所示。

package cn.jbit.bean;/*** 顺序栈。

* @author 北大青鸟class StackS {private int maxSize; // 栈的容量private long[] stackArray; // 使用数组表示栈private int top; // 栈顶指针/*** 构造方法。

* @param s*/public StackS(int s) {maxSize = s;stackArray = new long[maxSize];top = -1;}/*** 入栈操作。

* @param j 入栈元素*/public void push(long j) {stackArray[++top] = j;}/*** 出栈操作。

* @return 栈顶元素*/public long pop() {return stackArray[top--];}/*** 获取栈顶元素。

* @return 栈顶元素*/public long peek() {return stackArray[top];}/*** 判断栈是否为空。

* @return*/public boolean isEmpty() {return (top == -1);}/*** 判断栈是否满。

* @return*/public boolean isFull() {return (top == maxSize - 1);}/*** 测试方法。

* @param args*/public static void main(String[] args) {StackS stack = new StackS(10);stack.push(20);stack.push(40);stack.push(60);stack.push(80);while (!stack.isEmpty()) {long value = stack.pop();System.out.println(value);}System.out.println("");}}// end class StackS在main方法中,创建了一个长度为10的栈,并依次对四个元素进行入栈操作,然后通过while循环实现栈的遍历,循环条件中使用isEmpty()判断栈是否为空,通过pop()方法输出栈顶元素。

运行结果如图4所示,可以看到出栈顺序和入栈顺序正好相反。

五、链栈定义类StackL表示链栈,其中使用LinkedList来表示栈,采用前插方法,第一个元素为栈顶。

通过addFirst()方法完成入栈操作,通过removeFirst()完成出栈操作;代码如下所示。

package cn.jbit.bean;import java.util.*;/*** 栈的链表实现。

* @author 北大青鸟*/public class StackL {private LinkedList ll = new LinkedList(); //使用LinkedList表示栈/*** 入栈操作。

* @param o 入栈对象*/public void push(Object o) {ll.addFirst(o);}/*** 出栈操作。

* @return 出栈对象*/public Object pop() {return ll.removeFirst();}/*** 取出栈顶对象。

* @return 栈顶对象*/public Object peek() {return ll.getFirst();}/*** 判断栈是否为空。

* @return*/public boolean empty() {return ll.isEmpty();}/*** 测试方法。

* @param args*/public static void main(String[] args) { StackL ms = new StackL();ms.push("zhangsan");ms.push("lisi");ms.push("wangwu");System.out.println(ms.pop());System.out.println(ms.peek());System.out.println(ms.pop());System.out.println(ms.empty());}}Struts2中的ValueStack一、值栈值栈(ValueStack)是Struts 2 的一个核心概念,类似于正常的栈,符合后进先出的栈特点,可以在值栈中放入、删除和查询对象。

Struts 2对OGNL进行了扩充,将值栈作为OGNL的根对象。

ValueStack实际上就是对OGNL的封装,OGNL主要的功能就是赋值与取值,Struts2正是通过ValueStack来进行赋值与取值的!ValueStack是一个接口,而OgnlValueStack是strtus2中的缺省实现。

ValueStack中的数据,分两个部分存放:root和context(这与OGNL中的概念一致),同时ValueStack暴露相关的接口:void setValue(String expr, Object value);Object findValue(String expr);用来通过OGNL表达式对ValueStack中的数据进行操作!二、栈的基本操作ValueStack中的root对象是CompoundRoot,CompoundRoot继承了ArraryList,提供了额外的方法:push()和pop()方法,用来对root对象中所包含的数据进行存取!public class CompoundRoot extends ArrayList {public CompoundRoot() {}public CompoundRoot(List list) {super(list);public CompoundRoot cutStack(int index) { return new CompoundRoot(subList(index, size())); }public Object peek() {return get(0);}public Object pop() {return remove(0);}public void push(Object o) {add(0, o);}}正是通过这两个方法,CompoundRoot变成了一个栈结构!压栈操作,将导致对象被放到CompoundRoot的第0个元素上(第0个元素是栈顶),其它对象被依次往后移动;出栈操作,将导致CompoundRoot的第0个元素被移除(即栈顶元素被弹出),其它对象被依次往前移动!OGNL不支持多个root对象,而struts2能够支持多个root对象,它对OGNL做了扩展。

如果某个OGNL表达式被传递给ValueStack(即调用ValueStack的setValue或findValue 方法),而表达式中包含有对root对象的访问操作,ValueStack将依次从栈顶往栈底搜索CompoundRoot对象中所包含的对象,看哪个对象具有相应的属性,找到之后,立刻返回。

在Struts2中,一个请求在最终到达Action的方法之前,Action对象本身会被压入ValueStack(实际上就是放到ValueStack的CompoundRoot中),所以Action对象是CompoundRoot中的一个元素。

看下面的代码:public class UserAction {private String username;private Integer age;private boolean valid;//查看用户的详细信息public String detail(){username = "张三";age = 18;valid = true;return "detail";}在Action中,给Action的username/age/valid赋值。

Detail页面如下:username:<s:property value="username"/> <br/>valid:<s:property value="valid"/> <br/>age:<s:property value="age"/> <br/>上述JSP页面将能正确将它们的值取出。

相关文档
最新文档