算法与数据结构 (第2版) 数据结构的一个疑问

wasltone 2005-04-07 05:14:48
算法与数据结构 (第2版) 数据结构的一个疑问
他用指针完成一个栈,栈的MAKENULL操作,就是把栈变为空栈的操作,
原文代码就把头指针指向尾指针,并没有删除数据
那原来插入的数据并没有在内存中删除,不是会造成内存超出,越来越大么?
...全文
176 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
deKnuth 2005-04-08
  • 打赏
  • 举报
回复
刚才理解错了,这个应该是保留栈的起始地址,内存可以被其他程序使用,而如果这个栈再被启用的话就可以直接用原先保留的地址进行操作。
deKnuth 2005-04-08
  • 打赏
  • 举报
回复
那个是建立空栈的操作啊,不是清空栈
Knuthocean 2005-04-07
  • 打赏
  • 举报
回复
PUSH过程如下,每次New了一个空间
procedure Push(x:integer;S:Stack);
var
p:^Stack;
begin
new(p);
p^.element:=x;
p^.next:=S;
S:=p;
end;

type
stack=record
top:integer;
elements:array[1..max] of integer
end
这好像有矛盾吧!!

Knuthocean 2005-04-07
  • 打赏
  • 举报
回复
不会的,用数组表示的时候你预先就已经分配好了内存,你只能用S.top=S.bottom来逻辑上表示栈空,这个静态数组不会去动态分配内存!!
整个栈的操作过程中如果数据太多就溢出,数据很少时栈中可用的空间就是预先分配好的,如果你在栈操作过程中还使用动态分配内存,那就没有必要用数组表示了,直接用list不更好吗?

不知道这样说楼主明白不?
wasltone 2005-04-07
  • 打赏
  • 举报
回复
看错了,不过问题还是存在,他里面写的是队列但是还是没有Dispose。。。
不过是栈还是队列,都应该要Dispose阿//
下了,明天来讨论
wasltone 2005-04-07
  • 打赏
  • 举报
回复
对阿,可是...MAKENULL里面没有Dispose。。。
这说明什么,当Stack很大的时候,无数次MAKENULL却没有删除数据。。。。
这,真的是我发现的算法漏洞么?
你QQ多少,明天来了继续联系,今天可能要下了
晨星 2005-04-07
  • 打赏
  • 举报
回复
new出来的东西是要dispose的呀。
wasltone 2005-04-07
  • 打赏
  • 举报
回复
我正在试验MAKENULL以后的老指针还有没有用,
可是大家一致都这样用,而且书上也这样。。。
不会吧?
晨星 2005-04-07
  • 打赏
  • 举报
回复
如果真是这样,那就真的是这个算法有问题了。
wasltone 2005-04-07
  • 打赏
  • 举报
回复
PUSH过程如下,每次New了一个空间
procedure Push(x:integer;S:Stack);
var
p:^Stack;
begin
new(p);
p^.element:=x;
p^.next:=S;
S:=p;
end;
wasltone 2005-04-07
  • 打赏
  • 举报
回复
对不起,我弄错了。。楼上这个才是指针链表表示法,我打成了数组了
wasltone 2005-04-07
  • 打赏
  • 举报
回复
指针表示的Stack定义
type
stack=record
next:^stack;
elements:integer
end
每次压入一个数据,Next指针就申请一个空间,现在关键问题是,这些空间什么时候被删除了?
晨星 2005-04-07
  • 打赏
  • 举报
回复
elements:array[1..max] of integer
这不明明是数组实现的栈么?
wasltone 2005-04-07
  • 打赏
  • 举报
回复
原书的程序
Procedure MAKENULL(var S:Stack)
begin
S.top:=0;
end;

Stack的定义如下
type
stack=record
top:integer;
elements:array[1..max] of integer
end
wasltone 2005-04-07
  • 打赏
  • 举报
回复
逻辑清空?存到现有的程序中?
他是通过new()申请到的空间,况且Makenull过程中也没有dispose()函数过[Dispose相当于C++的Delete],通过new()申请到的,程序也没有Dispose,他怎么会自己清空?
gRempCH_eNter 2005-04-07
  • 打赏
  • 举报
回复
不会溢出吧,以后加入的内容,可以存到现有的内存中!
晨星 2005-04-07
  • 打赏
  • 举报
回复
看不出是使用链表。
即使用链表,也可以不清空,只要逻辑上“清空”就可以了。
wasltone 2005-04-07
  • 打赏
  • 举报
回复
源代码不是一句话就搞定的?
procedure makenull(S:stack);
begin
s.top:=s.bottom;
end

PASCAL描述
s是栈,top是头指针 bottom 是尾指针。。。
这么简单还要看代码?
chenyec 2005-04-07
  • 打赏
  • 举报
回复
把原代码贴出来啊!这样怎么回答你的问题啊!
wasltone 2005-04-07
  • 打赏
  • 举报
回复
我说的就是用链表,他用指针的...
Makenull时候又没有Dispose()过,删掉指针申请来的空间。
这样不是会使数据仍然存于内存中么?
加载更多回复(1)

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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