每次推送后都会重置堆栈并显示空消息

时间:2015-11-19 20:52:41

标签: c++ visual-studio-2012

我有一个包含3个类的程序。

第一个用于定义节点(我的节点是一个包含9个元素的数组) - 第二个包含一些函数 - 第三个是定义静态堆栈(我有一个包含100个成员的堆栈,每个成员是一个包含9个成员的数组)< / p>

假设在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);
}

1 个答案:

答案 0 :(得分:0)

此功能

void func::expand(node n,stack st)

按值st参数,意味着它有自己的st副本,并且它所做的任何更改都只会影响该副本。

您可能想要的是通过引用传递st,以便该函数可以对传入的对象进行更改。为此,请将函数声明和定义更改为:

void func::expand(node n,stack &st)