为什么取栈顶元素要用 e=*(S.top-1)不是应该是e=*S.top才对么?

liangshixue 2010-03-31 11:34:37
struct zhan//定义一个栈的结构体
{
int *base;//在栈构造之前和销毁之后,base的值为NULL
int *top;//栈顶指针
int stacksize;//当前已分配的存储空间,以元素为单位
};
struct zhan S;
..................................................................................

int GetTop()
{
int e;
if(!S.stacksize)
printf("栈不存在!!!\n");
else
if(S.top==S.base)//判断栈是否为空,为空则返回错误
return ERROR;
e=*(S.top-1);
printf("栈顶元素为%d\n",e);
return OK;
}

..................................................................................

int Push()
{
if(!S.stacksize)
printf("栈不存在!!!\n");
else
{
int i,j,e;
printf("请输入要插入的数的个数:");
scanf("%d",&i);
printf("请输入要插入的数:\n");
for(j=1;j<=i;j++)
scanf("%d",&e);
if(S.top-S.base>=S.stacksize)//栈满,追加存储空间
{
S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));
if(!S.base)
exit(OVERFLOW);//存储分配失败
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;//头指针加1,插入元素成功
printf("插入元素成功!!!\n");
}
return OK;
}
..................................................................................

int Pop()
{
if(!S.stacksize)
printf("栈不存在!!!\n");
else
{
int e;
printf("请输入要删除的数:\n");
scanf("%d",&e);
if(S.top==S.base)//判断栈是否为空,空则返回错误
return ERROR;
e=*--S.top;//头指针减1,删除元素成功
}
return OK;
}

栈顶应该指向分配空间最后一个元素的首地址 为什么取栈顶要*(S.top-1);
还有出栈的时候也是同样的迷惑 e=*--S.top;//头指针减1,删除元素成功
应该是e=*S.top--才对啊
...全文
4626 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
k386131549 2010-12-06
  • 打赏
  • 举报
回复
同样的问题 学习了
albertweil 2010-07-14
  • 打赏
  • 举报
回复
上面讲的很好 谢谢啦!
albertweil 2010-07-14
  • 打赏
  • 举报
回复
上面讲的很好 谢谢啦!
brk1985 2010-04-22
  • 打赏
  • 举报
回复 6
int Push()
{
.....................
*S.top++=e;//头指针加1,插入元素成功
.........
}
-------------------

楼主看下【*S.top++=e;】这个语句,每次添加完一个元素后(入栈),S.top后移一个位置,即S.top指向这个刚添加的元素的下一个位置;所以S.top没有指向栈顶元素,而是指向栈顶元素的下一个位置。所以取栈顶元素 S.top 必须回退一个位置,即*(S.top-1)。
东大坡居士 2010-03-31
  • 打赏
  • 举报
回复
这个栈是自大定义的,看你的栈是怎样定义的,如果你的栈顶指针指向的是下一个可用的栈空间,那你取栈顶元素的时候就要*(S.top-1);而如果你的栈顶指针指向的是当前可能的空间,取顶就要*(s.top)--
cattycat 2010-03-31
  • 打赏
  • 举报
回复
*S.top--吧,就是先取栈顶的值,然后栈顶指针下移。
*(S.top-1)不对,这个取道的是栈顶的下面的元素。
或者e=*S.top;*S.top--也行
贪食蛇男 2010-03-31
  • 打赏
  • 举报
回复
标志位是指向最后一个元素的后面
liangshixue 2010-03-31
  • 打赏
  • 举报
回复
----------------------------------------------------
| | | | | ......
----------------------------------------------------
|
base,top


压栈后
----------------------------------------------------
6 | 7 | | | | ......
----------------------------------------------------
| |
base top

是不是压栈后top就指向这个位置啦?

意思就是这里的top实际是指向最后一个元素后面的没有数据的首地址对吧?可是为什么不指向最后一个元素的首地址呢。这样才符合逻辑嘛!
xiuxianshen 2010-03-31
  • 打赏
  • 举报
回复
你可以把堆栈理解成一个坑,top是坑的顶的指针,*top是取坑顶往上的那个值,要去堆栈顶的元素应该在坑顶的下面一个
pur_e 2010-03-31
  • 打赏
  • 举报
回复
插入的时候是*S.top++=e;//头指针加1,插入元素成功


很明显需要top-1才会指向数据啊

70,026

社区成员

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

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