社区
C语言
帖子详情
关于堆栈,push(1) push(2) pop() pop() 问此时栈顶内内容是什么?
zhangguagua
2003-11-22 09:28:15
关于堆栈,push(1) push(2) pop() pop() 问此时栈顶内内容是什么?
1,2还是不确定数
...全文
910
21
打赏
收藏
关于堆栈,push(1) push(2) pop() pop() 问此时栈顶内内容是什么?
关于堆栈,push(1) push(2) pop() pop() 问此时栈顶内内容是什么? 1,2还是不确定数
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
21 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
zhangguagua
2003-11-23
打赏
举报
回复
好了,问题基本很明朗了,谢谢大家,祝大家工作顺利。
GR
2003-11-23
打赏
举报
回复
pop EDI/DI //ESP -4//SP-2
参数表示出栈的内容到哪个地址里去。不是ESP/SP的指针到哪里去
zhangguagua
2003-11-23
打赏
举报
回复
此问题乃昨天华为的笔试一道题,小弟写的是不确定,昨天又觉得不对,顾来找高手请教。
GR
2003-11-23
打赏
举报
回复
错了。x86里的pop不是pop到具体的指针是pop到某一个地址。换句话。pop根本无法完全控制指针,它只是机械的上下移动每一次pop移动一次SP。
zhangguagua
2003-11-23
打赏
举报
回复
谁给我确认一下8086是不是象下面这样实现堆栈的
|_________| |_________| -->|_________|
|_________| -->|_________| |____2____|
-->|_________| ==> |____1____| ==> |____1____| ==>
|___...___| |___...___| |___...___|
push(1) push(2) pop(1)
|_________| |_________|
-->|____2____| |_________|
|____1____| ==> -->|____1____|
|___...___| |___...___|
pop()
zhangguagua
2003-11-23
打赏
举报
回复
哦,被大家说得越来说胡涂了,结果那就看栈的实现方式了,不过我认为,汇编里是象cxq249(cxq249)楼上大哥那样实现的栈。结果为1
piaoairy
2003-11-23
打赏
举报
回复
这不是C语言中的实现, 只是我对数据结构课布置的习题的一种实现。
正如GR说的, “讨论pop .push最好以机器语言为标准。”
而且不同的OS也会有不同的实现,知道如何正确使用push(), pop()就好了。
晨星
2003-11-23
打赏
举报
回复
你的栈是用什么数据结构实现的?
如果是链表,那么空了空了,哪还有什么确定不确定的问题啊?
cxq249
2003-11-23
打赏
举报
回复
应该为1
|_________| |_________| -->|_________|
|_________| -->|_________| |____2____|
-->|_________| ==> |____1____| ==> |____1____| ==>
|___...___| |___...___| |___...___|
push(1) push(2) pop(1)
|_________| |_________|
-->|____2____| |_________|
|____1____| ==> -->|____1____|
|___...___| |___...___|
pop()
piaoairy
2003-11-23
打赏
举报
回复
#define SUCCESS TRUE
#define FAILURE FALSE
忘记加了...
上面stack栈顶指针即指向最后一个进栈的元素。
下面我们让stack栈顶指针指向最后一个进栈的元素的上方空位的NO.1
void ClearStack(stack *s)
{
s->top = 0; /*** -1, 0 ***/
}
bool EmptyStack(stack *s)
{
if ( s->top==0)
return TRUE;
else
return FALSE;
}
bool Push(stack *s, int para)
{
if (s->top==maxsize-1)
{
printf("stack is full.\n");
return FAILURE;
}
else
{
s->data[s->top] = para; /*** 这里语句的顺序变化 ***/
s->top++;
return SUCCESS;
}
}
int Pop(stack *s)
{
if (EmptyStack(s))
{
printf("stack is empty.\n");
return FAILURE;
}
else
{
s->top--;
return s->data[s->top]; /*** 这里s->top就没必要 + 1 了 ***/
}
}
int GetStackTop(stack *s)
{
if (EmptyStack(s))
{
printf("stack is empty.\n");
return FAILURE;
}
else
return s->data[s->top - 1];
/*** 不要用s->top--, 那样会改变s->top 的值 ***/
}
...我也是刚学数据结构, 可能对stack理解的不很正确, 请大家指正。
GR
2003-11-23
打赏
举报
回复
这样就已经无法讨论了,问题上升到了函数封装的地步了,讨论pop .push最好以机器语言为标准。我个人认为。c语言里我确实不知道有pop 和push的实现,是我孤陋寡闻。
zoezinsser
2003-11-23
打赏
举报
回复
堆栈?
根据严蔚敏的那本书来说,此题我觉得是不确定!
当执行指令push(1);前,设栈顶指针为2,完后,入栈,指针改为3,如此直到退完栈;
栈顶指针恢复原来所指,即2单元!
而入栈前2单元中内容不确定,所以就............
piaoairy
2003-11-23
打赏
举报
回复
假设stack是 int型 并且此时为空, push(s,1), push(s,2)后stack内元素从TOP到BOTTOM依次为2, 1; pop(s), pop(s)之后2, 1先后出栈(LIFO, 后进先出); 此时stack为空,栈顶指针应该指向一个不确定数, 但一般的GetStackTop(s)函数会检查stack是否为空, 如果为空则返回NULL(在C的stdio.h中定义为0);
如果stack原来非空, 且栈顶为A, 则push(s, 1), push(s, 2), pop(s), pop(s)后栈顶依然为A。但栈顶指针却并不一定就指向A。因为在设计程序时stack可以有多种实现, 可以让栈顶指针指向最后进栈的一个元素, 也可以只想最后那个元素上的第一个空位。
==依赖于你如何在push()和pop()函数中调整栈顶指针。
但你用pop(s)和GetStackTop(s)应该都可以得到最后进栈的那个元素的值。
下面给出顺序stack的两种实现, 只是在栈顶指针的调整上有点区别。
#include <stdio.h>
#define maxsize 128
typedef enum
{
TRUE = 1,
FALSE = 0
} bool;
typedef struct
{
int data[maxsize];
int top;
} stack;
stack s;
void ClearStack(stack *s)
{
s->top = -1;
}
bool EmptyStack(stack *s)
{
if ( s->top<0)
return TRUE;
else
return FALSE;
}
bool Push(stack *s, int para)
{
if (s->top>=maxsize-1)
{
printf("stack is full.\n");
return FAILURE;
}
else
{
s->top++;
s->data[s->top] = para;
return SUCCESS;
}
}
int Pop(stack *s)
{
if (EmptyStack(s))
{
printf("stack is empty.\n");
return FAILURE;
}
else
{
s->top--;
return s->data[s->top+1];
}
}
int GetStackTop(stack *s)
{
if (EmptyStack(s))
{
printf("stack is empty.\n");
return FAILURE;
}
else
return s->data[s->top];
}
zhangguagua
2003-11-23
打赏
举报
回复
这么说如果第一次压栈前,为空栈,两次出栈后,指向空栈,此时空栈内容应该是不确定数才对呀
GR
2003-11-23
打赏
举报
回复
agree 天光早。
zhangguagua
2003-11-23
打赏
举报
回复
大家众说分云,能不能给个解释先,谢谢
atlcat
2003-11-22
打赏
举报
回复
应该是一个不确定数
Maxwell
2003-11-22
打赏
举报
回复
看栈顶指针怎么指了,也可能是2。如果栈顶指向下一个要存储的位置的话就是push 进去的2。
TianGuangZao
2003-11-22
打赏
举报
回复
栈顶应该是第一次压栈前的栈顶元素或空栈。
zhangguagua
2003-11-22
打赏
举报
回复
在up
加载更多回复(1)
什么是
堆栈
?c语言实现栈上的
pop
和
push
操作
堆栈
(stack)实现栈上
pop
和
push
操作解释。
push
/
pop
堆栈
指令
2、有时候,需要临时用一下某些寄存器,也可用一下,凭个人喜好;
堆栈
是一个先进后出的主存区域,位于
堆栈
段中,使用SS段寄存器记录器段地址。栈只有一个出口,即当前
栈顶
。
栈顶
是地址较小的一端(低端),它用
堆栈
指针寄存器SP指定。
堆栈
的两种基本操作,对应两条基本指令: 进栈指令先使
堆栈
指令sp减2,然后把一个字操作数存入
堆栈
顶部。
堆栈
操作的对象只能是字操作数,进栈时底字节存放于低地址,高字节存放于高
java中
push
和
pop
指令的作用_
push
和
pop
的区别?
1、
push
是什么?(推进)
push
就是推,延伸为推进。这个它是汇编的一个指令,(在其它语言中也可能会见到它)。意思都是差不多的,就是把一个元素放入栈中。你可以假想栈是一个放光盘的那种盒子,有底没盖,先
push
进去的光盘总是要等后
push
进去的出来后才能出来。2、
pop
是什么?(弹出)
pop
和
push
相反,它的意思是弹出,就是从栈里弹出一个元素,每次弹出的都是
栈顶
(光盘盒最上面那个,也就是最后放进...
汇编作业二:
堆栈
操作(
push
,
pop
)以及arm数据处理指令
堆栈
操作 在数据结构的学习中我们已经栈是先进后出的,汇编实现方面其实是通过将寄存器中的值存储(STR)到memory中来达到
push
的效果,而
pop
则是从memory中加载(LDR)值放到寄存器中。
堆栈
根据
栈顶
指针指向的空间是否放值(空/满),以及扩张方向(递增/递减)可分为4种类型:空递增(EA),空递减(ED),满递增(FA),满递减(FD)。ARM用的是FD类型。 FD: 满递减 ...
数组03— Stack :使用 Array 的
push
()和
pop
()方法实现
堆栈
数据结构
如果将数组视为
堆栈
,则
push
() 方法在
堆栈
顶部添加一个或多个元素。下面的示例创建一个名为 stack 的空数组,并在 stack 数组的末尾一个接一个地添加五个数字。一个
堆栈
有两个主要的操作,它们只发生在
堆栈
的顶部:
push
和
pop
。要做到这一点,您需要一个字母一个字母地将一个单词推入
堆栈
,然后从
堆栈
中弹出这些字母。
pop
()方法删除数组末尾的元素,即一次删除一个
堆栈
顶部的元素。那么,在今天的教程中,我们一起来学习 JavaScript
堆栈
数据结构,并了解如何将数组用作
堆栈
。
C语言
69,382
社区成员
243,073
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章