知情人士帮忙 对于栈这种数据结构,能通过非常规方法进行随意访问吗

qihuanfengyun 2009-09-17 12:09:12
栈是限定仅在表尾进行插入或删除操作的线性表。
顺序栈:利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。
链栈:利用链表实现。

顺序栈的类C语言定义:

typedef struct{

SElemType *base;

SElemType *top; //设栈顶栈底两指针的目的是便于判断栈是否为空

int StackSize; //栈的当前可使用的最大容量.

}SqStack;
对于这种结构的“限定仅在表尾进行插入或删除操作”是我们的安排,也就是大家的约定。

现在讨论我们能不能通过指针s,把指针s指向栈(非空)中,除第一个元素以外的任意元素。
1、将栈中s指向的元素复制给同类型的变量;
2、将栈中s指向的元素上面的元素,逐一向下移动一个位置(和s指向元素,相邻的上一个元素覆盖s指向元素,其他上面元素之一覆盖与之相邻下一元素);
3、将top指针相应的增或减;
通过上面的方法我们就从栈中把先放进去的元素先取出来了。

我就是想知道有没有这种可行性,如果不行那又为什么?

对于汇编中的栈这种方法我认为是可行的,因为cpu根据ss:sp确定堆栈段,我可以采取偷梁换柱的方法将ss赋给ds。把堆栈段当成数据段把先放进的数据取出来,然后再做和上面3步类似的处理,然后将ds返还ss,将sp合理设置。

对于这个问题,我最终只是想弄清楚栈这种数据结构按照后进先出的操作方式是我们的安排,我们人为的约定,它到底存不存在非常规方法(上面的操作只是我认为可能的一种非常规方法)可以不安约定办事!

...全文
358 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
twilightgod 2009-10-01
  • 打赏
  • 举报
回复
从面向对象的角度来说是没有随机访问的方法
但是栈本来就是线性表,如果用顺序实现而非链式实现肯定能随机访问
glacier3d 2009-09-21
  • 打赏
  • 举报
回复
栈在计算机里是一种很伟大的结构
lz应该看看自动机理论、图灵机之类,到时候你就不会有这种想法了
对于机器来说,它的执行模式是死的,它自然用栈这种后进先出的模式来不断折腾
对于程序员编码来说,那什么都很灵活,想怎么干就怎么干吧,一些crack方法什么的都可以用啊

-------个人观点,呵呵
wotur 2009-09-21
  • 打赏
  • 举报
回复
嵌入式系统中栈空间是自己定义的,肯定可以访问了哦,
系统异常的时候还能打印出来分析!
sytstarac 2009-09-20
  • 打赏
  • 举报
回复
栈一般不是有序队列。
勤奋的沉沦 2009-09-18
  • 打赏
  • 举报
回复
如果你知道其内存结构, 就随便访问了。
qihuanfengyun 2009-09-17
  • 打赏
  • 举报
回复
我要把先放进去的数据先取出来啊!
hyram 2009-09-17
  • 打赏
  • 举报
回复
pop出来2个,再把第一个push进去,就是取出了第二个。和你说的逐一移动位置从复杂度上来说是一样的。
acdbxzyw 2009-09-17
  • 打赏
  • 举报
回复
必須能啊,呵呵,只要有地址想怎麼做怎麼做。
Damn_boy 2009-09-17
  • 打赏
  • 举报
回复

Val_Type *ptr = ESP+(rand()%Mod)

不知道堆栈的大小,
你把指针乱指是很危险的
ahjoe 2009-09-17
  • 打赏
  • 举报
回复
行,随便,想怎么访问就怎么访问,只要你清除自己在干什么
PeacefulBY 2009-09-17
  • 打赏
  • 举报
回复
栈说:我不是队列啊lz你认错人了啊!
gumbour 2009-09-17
  • 打赏
  • 举报
回复
当然能,但如果你这样操作的话,你操作的是数组还是栈?
jiangxc2004 2009-09-17
  • 打赏
  • 举报
回复
栈本身是来解决先进后出问题的,如果你的问题不是先进后出,为什么非要栈来做这件事呢,不是不能像你说的那么做,只是那样做的话就不该称之为栈了,就好比你家电饭煲本来该是用电来加温的,你却非得把它拿到燃气灶上加热。
所以你应该考虑的是将你的问题重新建模,或者选取新的数据结构,而不是把栈改成你那样。
super_chris 2009-09-17
  • 打赏
  • 举报
回复
那就不是栈了
德意志军工 2009-09-17
  • 打赏
  • 举报
回复
算法只是为了解决问题,栈给了我们一个后进先出的思路来解决类似的问题。
具体实现应该依赖于需求。
很多时候一个业务的实现是需要多种算法的结合使用。
例如:
上公交要排队,所以可以试用队列的算法。
但老人具有优先权。这时候如果将队列改为优先队列是没有必要的,
因此就需要在原队列的基础上添加新的控制。

请教!!请教!!
cchvsgame 2009-09-17
  • 打赏
  • 举报
回复
当前行了,他是数组,就意味着,内存连续。只不代码要长些了
whg01 2009-09-17
  • 打赏
  • 举报
回复
用vector吧。
bffeey 2009-09-17
  • 打赏
  • 举报
回复
栈的目的就是防止随意访问
正如楼上说了
那你为什么不直接使用一般的链表或数组?
晨星 2009-09-17
  • 打赏
  • 举报
回复
如果你想有时先进后出,有时先进先出,那你当然可以自己动手写一个这样的“FakeStack”。
但别人会奇怪,那你为什么不直接使用一般的链表或数组?
晨星 2009-09-17
  • 打赏
  • 举报
回复
在汇编程序中,这种用法并不鲜见。

在一般的高级语言程序中,这种用法倒是不多,因为你既然使用高级语言,而且你本来完全可以使用队列,那你为什么还非要使用栈,却又想着实现FIFO呢?

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧