问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求栈中元素个数(StackLength)的两个算法那个正确?

发布网友 发布时间:2022-05-05 09:22

我来回答

3个回答

热心网友 时间:2022-06-27 06:25

不正确, 因为前面我们已经提到过,通过继承Vector,很大一部分功能的实现就由Vector涵盖了。Vector的详细实现我们会在后面分析。它实现了很多的辅助方法,给Stack的实现带来很大的便利。现在,我们按照自己的思路来分析每个方法的具体步骤,再和具体实现代码对比。
empty
从我们的思路来说,如果要判断stack是否为空,就需要有一个变量来计算当前栈的长度,如果该变量为0,则表示该栈为空。或者说我们有一个指向栈顶的变量,如果它开始的时候是设置为空的,我们可以认为栈为空。这部分的实现代码也很简单:
在这里,判断是否可以取栈顶元素在peek方法里实现了,也将如果栈为空则抛异常的部分包含在peek方法里面。这里有必要注意的一个细节就是,在通过peek()取到顶端的元素之后,我们需要用removeElementAt()方法将最顶端的元素移除。我们平时可能不太会留意到这一点。
为什么要移除呢?我们反正有一个elementCount来记录栈的长度,不管它不是也可以吗?
实际上,这么做在程序运行的时候会有一个潜在的内存泄露的问题。因为在java里面,如果我们普通定义的类型属于强引用类型。
比如这里vector就底层用的Object[]这个数组强类型来保存数据
。强类型在jvm中做gc的时候,只要程序中有引用到它,它是不会被回收的。这就意味着在这里,只要我们一直在用着stack,那么stack里面所有关联的元素就都别想释放了。这样运行时间一长就会导致内存泄露的问题。那么,为了解决这个问题,这里就是用的removeElementAt()方法。

热心网友 时间:2022-06-27 06:26

这只是一个伪代码,就算法思想考虑都是正确的。
第一个逐一判断是否到底,否则累加1。
第二个直接用栈顶位置减去栈底位置。
前者要求内存空间连续,后者要求存放位置连续(比如数组下标)追问前者要求内存空间连续,后者要求存放位置连续(比如数组下标)....这个意思很奇怪,我写的栈是顺序存储的,存放在内存空间的位置连续

追答比如开新的栈空间的时候,又额外开辟了其它变量x的空间,这时候栈内元素的地址就不连续了,p--后就可以跑到x的地址上。
不过理解成伪代码我们可以认为它的p--就是到下一个元素的地址。
如果用容器vector里的stack就没有这个问题了。

看见了楼上的回复。
通常是用第一种方式的。因为栈通常都是指针操作,数组操作局限性太大学到后面就几乎不用了。动态链表实现时通常不会额外记录栈顶或栈底元素的地址。比较之下前者更好,后者更好写

热心网友 时间:2022-06-27 06:26

感觉都正确,这两个没有什么区别啊。追问第二个算法是我自己写的,网上找打的居然都是第一个算法.....为什么?最优算法是?

追答这两个没有什么本质的区别,
就像一般的一维数组,告诉两个下标,让计算两者之间的元素个数,
方法1,就是直接拿下标相加减
方法2,就是让大的下标递减直到小的下标。
原理就是这个原理,这两个之间那个最好,我说不清楚,因为第二个里面牵涉到一系列的转换,这种转换我们是看不到的,当然第一个里面也有。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
ef英语哪个好 EF英孚英语培训怎么样? 英孚英语好不好 EF英孚教育到底好不好 大佬们,麦芒7和荣耀10那个值得入手?2500以下的机子还有啥好推荐的么... 介绍几款2500元以前的手机 像素一定要高 其他的不做要求 近期想入手一部安卓手机,价格2200到2500左右…买HTC desire Z还是 三星... 笔记本忘记开机密码怎么办急死了 笔记本电脑屏幕开机锁忘记密码 怎么办?急死了 华硕笔记本电脑开机密码忘记了怎样找回?系统是Windows 7旗舰版... 西湖的由来 水发干木耳用多少度的水泡才好?要泡多久?如题 谢谢了 考研网上确认需要身份证吗 研究生网上确认时学校会去具体查社保缴费记录吗? 急!!!关于武汉大学研究生网上确认还是现场确认~ 研究生报名后必须现场确认吗? 研究生一志愿上线需要在研招网上进行什么确认操作么? 研究生考试信息确认 研究生网上报名和现场确认的具体流程是什么,说的详细点 研招网有人工服务吗 我想买个家用高清3D投影仪,但不知道怎么挑啊。 想买一个投影仪家用,什么品牌好?买的时候主要看哪些参数? 初三新学期打算英语作文 求一篇 即将升入初三的感想作文 500字就行 2015初三学生的打算600字作文 微商代理怎么做?棒女郎真的能赚钱吗 微商,做代理,真的靠谱吗 做宝洛格的代理月入过万是真的吗? 做代理会被骗吗? 在网上做代理是不是真的啊! 栈中元素个数问题 西湖十景中的什么和什么就是苏轼当年出任杭州太守时的成就 计算机二级公共基础中关于栈、队列的元素计算? 计算机怎样利用栈计算集合中元素个数? 求链队Lq中包括栈元素个数的算法。 数据结构:栈,队列,循环队列,元素个数计算,就是已知头尾,求个数?? 栈的容量是指一个栈可以容纳多少个元素吗? 编一个函数查能统计当前堆栈的元素个数。 函数头为int Stacklen(SqStack S) 计算机二级栈top的运算 c++中怎么获取数组中元素的个数 如何将栈中所有元素的相加? 为什么oppo手机不兼容篮牙自拍杆? 太阳膜有哪几种? 汽车太阳膜有几种分类? 脸上长痘痘能多吃老酸奶吗? 什么是太阳膜 太阳膜怎么分好坏,现在还有什么品牌可言? 防爆膜和太阳膜有什么区别,哪个 汽车太阳膜与防爆膜有什么区别? 太阳膜应该怎么选?