关于堆栈,push(1) push(2) pop() pop() 问此时栈顶内内容是什么?

zhangguagua 2003-11-22 09:28:15
关于堆栈,push(1) push(2) pop() pop() 问此时栈顶内内容是什么?
1,2还是不确定数
...全文
910 21 打赏 收藏 转发到动态 举报
写回复
用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)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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