关于栈的一个问题

beijixuexiong 2006-04-02 06:21:49
C++ Primer 3rd P128里说:
"作为最后一个例子我们考虑栈stack 的设计栈是一个基本的计算机科学的数据抽
象它允许以后进先出LIFO 的顺序放入或取出数值栈的两个基本操作是向栈中压入
push 一个新的值以及从栈中弹出pop 最后的值为讨论方便假设我们用vector
来实现栈
我们的栈维护了一个对象top 它表示下一个可用来压入数据值的槽要实现压入push
语义我们必须把这个值赋给由top 表示的槽然后再将top 增加1 这种情况需要哪种形式
的递增操作符呢我们希望先使用当前的值然后再把它加1 这正好是后置形式的行为.stack[ top++ ] = value;"

这就是说压栈得时候是先压,后移动栈顶指针,但是汇编上讲得是:“在压栈得时候,先将sp减1,压入一个值,再减1,再压”
也就是说先改变栈顶指针,后压入元素。

请问高手到底应该怎样理解?按第一种说发,栈顶TOP每次都指向了一个空值,然后压入值,然后再指向空值,第二种的话是相当于top始终指向栈顶得元素(非空值)。。
...全文
185 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ENOUGH_XU 2006-04-03
  • 打赏
  • 举报
回复
记的不应该有错,但是你应该看看书上,书上是先把SP的地址+2或者-2,它的指针已经移位.
不知道能不能回答你,还是我理解不够透彻.
lei001 2006-04-03
  • 打赏
  • 举报
回复
mark
beijixuexiong 2006-04-03
  • 打赏
  • 举报
回复
ENOUGH_XU(足球小兵)
可不可以说清楚一点,“内存地址的分配是相反的”,Primer上说的是模拟栈啊,Sp也是堆栈指针;
另外我所知道的:
1,随着栈元素增加,SP向低地址方向延伸
2,压栈:SP减1,压入高字节,SP又减1,压低字节
3,出栈:弹出低字节,SP加1,再弹出高字节,SP加1
以上三点是上课做了笔记了的~应该是正确的
ENOUGH_XU 2006-04-02
  • 打赏
  • 举报
回复
不是啊,看来楼主没有看清楚书吧,汇编上的SP是地址,它在操作时地址已经先变化(+2)了啊,而且,汇编的地址是先存低位再存高位,但是内存地址的分配是相反的.所以你说的都是正确的.
beijixuexiong 2006-04-02
  • 打赏
  • 举报
回复
hope_lzf(我不想说)
从数据抽象上是这样的话,那么在实际的存储过程中究竟是那种情况呢?我们讲的80286的栈说是先改变SP,后压入数据;是不是在实际的系统中,两种情况都有可能呢?只要符合LIFO的规则就可以了?
fiftymetre 2006-04-02
  • 打赏
  • 举报
回复
先使用当前的值然后再把它加1 这正好是后置形式的行为.stack[ top++ ] = value;"

如果先移动栈顶指针时,那它指向那呢?





hope_lzf 2006-04-02
  • 打赏
  • 举报
回复
两种实现都正确。既然是抽象就与实现无关。栈的特点是LIFO,只要数据结构的逻辑特性表现为LIFO就是一个栈。
再者,汇编语言也不尽如果楼主说的那样。不同的指令系统有不同的实现,有时甚至两者都正确,取决于编译环境的设置情况(如ARM指系统等)。

64,684

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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