2011-11-02 44 views
0

为了将其打印出来,我已经很难重新填充堆栈了。我正在使用节点实现,所以我认为这是令我困惑的事实。任何建议,将不胜感激,谢谢。使用节点实现的重新填充堆栈

这是我原来的堆栈::打印()

// Function to print Gumball info field (color and counter) 
void Stack::print() 
{ 
    Node *p; 
    Type x; 

    while(top != NULL) { 
     p = top; 
     x = p -> getinfo(); 
     cout << " " << x.color << " " << " " << x.counter << endl << endl; 
     top = p -> getnext(); 
    } 

    return; 
} 

This is my stack with my attempt to loop and store in temp. It compiles but still is not working as suppose to

void Stack::print() { Node *p,*q; Type x,x_temp; while(top != NULL) { p = top; x = p -> getinfo(); cout << " " << x.color << " " << " " << x.counter << endl << endl; x_temp = x; q = top; top = p -> getnext(); } while(top != NULL) { q -> setinfo(x_temp); q -> setnext(top); top = q; } return; } 

+0

'top'是一个成员变量吗?如果是这样,你为什么要在'print'中修改它? 'print'应该保持你的栈不变。 –

+0

我试图只修改它来打印堆栈,然后将所有东西都还原回原来的....基本上从顶部获取信息,打印它然后移动到下一个口香糖。之后,我想将所有的东西从临时堆栈移回原来的顺序。 – 123me

回答

0

Stack::print显示当前的堆栈“snapshop”,所以它没有业务修改任何Stack的成员变量。没有必要对堆栈进行“备份”并将其还原。你只需要以不妨碍堆栈的方式走下堆栈。

而不是使top成员变量走下堆栈,初始化本地Node指针将与top相同,并使本地指针走下堆栈。

换句话说,top在您的print成员函数中应该是只读的(不可变的)。为了强制成员函数不能修改任何成员变量,可以通过在成员函数声明末尾添加const关键字来使成员函数不可变。

例子:

// Const member function enforces that the Stack remain unmodified 
void Stack::print() const 
{ 
    Node *p = top; // Make p initially point to the top of the stack 
    Type x; 

    while(p != NULL) { 
     x = p -> getinfo(); 
     cout << " " << x.color << " " << " " << x.counter << endl << endl; 
     p = p->getNext(); // Make p walk down the stack to the next Node. 
    } 
} 
+0

噢,我明白了。我总是也能够弄清楚如何将原始物品存储在临时堆栈中......然后清空临时堆栈,以便将它们放回原始堆栈。谢谢。 – 123me

1

如果您想打印一个栈的内容,然后按所有值回以同样的顺序,我建议推值设置到一个打印后不同的堆叠。然后,一旦原始堆栈为空,将第二个堆栈中的所有值弹回原始堆栈。

+0

我编辑我的问题......我发现我的企图,以节省一个临时堆,推动所有元素从临时回原来的堆栈,请参阅我原来的问题。 – 123me