C++ 堆栈在每次推送后重置,并显示空消息
我有一个3类的程序 第一个用于定义节点(我的节点是一个包含9个元素的数组)-第二个包含一些函数-第三个用于定义一个静态堆栈(我有一个包含100个成员的堆栈,每个成员是一个包含9个成员的数组) 假设在main()中,我调用第二个类中的一个函数(例如expand())。expand函数用于将节点推入堆栈(推入UN)并更新堆栈指针。例如,在此之后,我想访问堆栈的顶部节点,并使用main()弹出该节点。但是我成功了。当我通过调试工具观察UN和top节点时,我看到它们的数量在每次推送后都被重置(堆栈不接受新元素)。怎么了 以下是所需的部分代码:C++ 堆栈在每次推送后重置,并显示空消息,c++,visual-studio-2012,C++,Visual Studio 2012,我有一个3类的程序 第一个用于定义节点(我的节点是一个包含9个元素的数组)-第二个包含一些函数-第三个用于定义一个静态堆栈(我有一个包含100个成员的堆栈,每个成员是一个包含9个成员的数组) 假设在main()中,我调用第二个类中的一个函数(例如expand())。expand函数用于将节点推入堆栈(推入UN)并更新堆栈指针。例如,在此之后,我想访问堆栈的顶部节点,并使用main()弹出该节点。但是我成功了。当我通过调试工具观察UN和top节点时,我看到它们的数量在每次推送后都被重置(堆栈不接受
#include<iostream>
using namespace std;
#define max 100
class node
{
public:
int node_n[9];
friend class func;
friend class stack;
};
node n;
class node;
class func
{
public:
func();
void expand(node,stack);
friend class stack;
};
class node;
class stack
{
private:
int sp;//stack pointer
public:
node un[max];//saves expanded noded(children)
stack();
int isempty(); //this will show whether stack is empty or not
int isfull(); //this will show whether stack is full or not
void push(node);
node pop();
};
//****************************
stack::stack()
{
sp=-1;
}
//****************************
int stack::isempty()
{
if(sp==-1)
return true;
else
return false;
}
//****************************
int stack::isfull()
{
return sp==max-1;
}
//****************************
node stack::pop() //un=un-[n]
{
for(int k=0;k<=8;k++)
n.node[k]=un[sp].node[k];
sp--;
return n;
}
//****************************
void stack::push(node n ) //un=un+{x1....xn}
{
sp++;
for(int k=0;k<=8;k++)
un[sp].node[k]=n.node[k];
}
//****************************
void func::expand(node n,stack st)
{
if ( n.node_n[0]==0 )
{
if(n.node_n[1]==0)
{
n.node_n[0]=1;
n.node_n[1]=1;
st.push(n);
.
.
.
//******************************
int main()
{
func b;
stack st;
node n2;
node s; //initial state
node g; //goal state
for(int h=0;h<=8;h++)
{
s.node[h]=0;
g.node[h]=1;
}
//n2=s;
st.push(s);
Lable1:
n2=st.pop();
b.expand(n2,st);
goto Lable1;
system("pause");
return(0);
}
#包括
使用名称空间std;
#定义最大值100
类节点
{
公众:
int node_n[9];
朋友类函数;
友元类栈;
};
节点n;
类节点;
类函数
{
公众:
func();
空洞扩展(节点、堆栈);
友元类栈;
};
类节点;
类堆栈
{
私人:
int sp;//堆栈指针
公众:
节点un[max];//保存扩展节点(子节点)
堆栈();
int isempty();//这将显示堆栈是否为空
int isfull();//这将显示堆栈是否已满
空推(节点);
节点pop();
};
//****************************
stack::stack()
{
sp=-1;
}
//****************************
int stack::isempty()
{
如果(sp==-1)
返回true;
其他的
返回false;
}
//****************************
int stack::isfull()
{
返回sp==max-1;
}
//****************************
节点堆栈::pop()//un=un-[n]
{
对于(int k=0;k此函数
void func::expand(node n,stack st)
按值获取st
参数,这意味着它有自己的st
副本,它所做的任何更改只会影响该副本
您可能希望通过引用传递st
,以便函数可以对原始传入对象进行更改。为此,请将函数声明和定义更改为:
void func::expand(node n,stack &st)
这是调试器的工作,而不是询问堆栈溢出问题。我检查了调试器,发现它工作不正常,因为我是编程新手,所以我认为可能代码有问题。那么,当使用调试器单步执行代码时,您观察到了什么?实际上什么工作不正常?当我将节点推入堆栈时(UN),堆栈的第一个成员,获取节点。但是,当我想到达堆栈顶部并使用pop函数将其删除时,我发现堆栈是空的。tnx。您的回答对我帮助很大