C++ 堆栈在每次推送后重置,并显示空消息

C++ 堆栈在每次推送后重置,并显示空消息,c++,visual-studio-2012,C++,Visual Studio 2012,我有一个3类的程序 第一个用于定义节点(我的节点是一个包含9个元素的数组)-第二个包含一些函数-第三个用于定义一个静态堆栈(我有一个包含100个成员的堆栈,每个成员是一个包含9个成员的数组) 假设在main()中,我调用第二个类中的一个函数(例如expand())。expand函数用于将节点推入堆栈(推入UN)并更新堆栈指针。例如,在此之后,我想访问堆栈的顶部节点,并使用main()弹出该节点。但是我成功了。当我通过调试工具观察UN和top节点时,我看到它们的数量在每次推送后都被重置(堆栈不接受

我有一个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。您的回答对我帮助很大