社区
C语言
帖子详情
关于堆栈,push(1) push(2) pop() pop() 问此时栈顶内内容是什么?
zhangguagua
2003-11-22 09:28:15
关于堆栈,push(1) push(2) pop() pop() 问此时栈顶内内容是什么?
1,2还是不确定数
...全文
1022
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
操作解释。
编程实现一个
堆栈
类Stack,要有
push
()压栈方法,
pop
()出栈方法,clear()方法
1*编程实现一个
堆栈
类Stack,要求需要含有
push
()压栈方法,
pop
()出栈方法,clear()方法。我们采用的是典型的封装,这里的
堆栈
采用先进后出的顺序存储数据,通过两个传统的
堆栈
操作来控制,这两种方法分别是压栈(pose)和出栈(
pop
).如果在
堆栈
的上面加入一项,用压栈如果从
堆栈
中取出一项,用出栈Stack类实现整数的
堆栈
,参考代码如下://这个类定义一个变量
js开发:数组的
push
()、
pop
()、shift()和unshift()
JavaScript是一种弱类型语言,不像其它程序语言需要严格定义数据类型。在JavaScript中数组可以任意修改变动,这样也就出现了一个
问
题,如果边遍历数组边操作数组(比如删除当前项,则所有之后的数组元素下标都将向前移动)是一件很危险的事情。 JavaScript的数组是一个拥有
堆栈
和队列自身优点的global对象。也就是说JavaScript数组可以表现的像栈(LIFO)和队列(FIF
PUSH
进栈指令和
POP
出栈指令
PUSH
进栈指令 指令格式:
PUSH
源 指令功能:将源操作数推入
堆栈
。 源操作数可以是16位通用寄存器、段寄存器或存储器中的数据字,但不能是立即数。
堆栈
是以“先进后出”的方式工作的一个存储区,栈区的段地址由SS寄存器的
内容
确定。
堆栈
的最大容量可为64K,即一个段的最大容量。
堆栈
指针SP始终指向
栈顶
,其值可以从FFFEH(偶地址)开始,向低地址方向发展,最小为0。 每次执行
PUSH
操作时,先修改SP的值,使SP←SP-2后,然后把源操作数压入
堆栈
汇中SP指示的位置上,低位字节放在较低地址单元,高位字节放在
C++ STL标准库:std::stack
堆栈
的使用 入栈
push
() 出栈
pop
() 获取元素top()
#include <iostream> #include <stack> #include <string> #include <list> #include <assert.h> using namespace std; void main() { stack<string,list<string> > s1; s1.
push
("苹果"); cout<<"\"苹果\" 放入
堆栈
中. "<&
C语言
70,038
社区成员
243,247
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章