TStack先进后出,TQueue先进先出,是这样吗,为什么我的代码结果是两者都是先进先出呢 ( 积分: 100 )

  • 主题发起人 主题发起人 lixiaohui
  • 开始时间 开始时间
L

lixiaohui

Unregistered / Unconfirmed
GUEST, unregistred user!
type
p=^integer;
var
MyQueue:TQueue
//声明队变量
MyStack:TStack
//声明栈变量
i,m:integer;
p1,p2:p;
begin
MyQueue:=TQueue.Create();

{Push部分}
for i:=0 to 10 do
begin
p1:=@i;
MyQueue.Push(p1);
end;
{Pop部分}

for i:=0 to (MyQueue.Count-1) do
begin
p1:=MyQueue.Pop;
m:=p1^;
memo1.Lines.Add(inttostr(m));
end;
memo1.Lines.Add(inttostr(MyQueue.Count));
{释放队的资源}
MyQueue.Free;

MyStack:=TStack.Create();
{Push部分}
for i:=0 to 10 do
begin
p2:=@i;
MyStack.Push(p2);
end;
{Pop部分}

for i:=0 to (MyStack.Count-1) do
begin
p2:=MyStack.Pop;
m:=p2^;
memo1.Lines.Add(inttostr(m));
end;
memo1.Lines.Add(inttostr(MyStack.Count));

MyStack.Free;
end;
 
呵呵,纯属巧合.
for i:=0 to 10 do
begin
p1:=@i;
MyQueue.Push(p1);
end;

每次push进去的都是变量i的地址,实际上11次push进去的值都一样.

for i:=0 to (MyQueue.Count-1) do
begin
p1:=MyQueue.Pop;
m:=p1^;
memo1.Lines.Add(inttostr(m));
end;
pop的时候每次也都是i变量的地址值,而i的值正随着循环在变化,所以每次显示出来的就是0-10了.
 
你的错误正如楼上所说.
其实,integer 和 pointer都实4个字节....问题很好解决...
for i:=0 to 10 do
begin
MyQueue.Push(ptr(I));
end;

for i:=0 to (MyQueue.Count-1) do
begin
p1:=integer(MyQueue.Pop)

memo1.Lines.Add(inttostr(p1));
end
//不要试图存取Pop的指针的内容,因为不可预见,所以会出错..
 
后退
顶部