2011-09-14 106 views
0

我有一个关于前面提到的问题的查询。修改堆栈的顶部而不访问StackType对象

我被给了这个函数原型void StackPop(NodeType *Top)并被告知修改堆栈的顶部而不访问堆栈对象。 StackPop函数这里是一个全局函数,而不是Stack类的成员函数。弹出之后,Top应该指向Top元素的新值。

作为一种解决方案,在这种情况下,只有当我们在调用时将堆栈的顶层节点的地址传递给函数时,才会弹出堆栈的顶部。例如:StackPop(&address); 要修改堆栈

NodeType* temp; 
temp = top; 
*top = (*top)->next; 
delete temp; 

这是简单的问题的答案或者是别的,有被照顾的情况下的顶部?

+0

是你的函数参数'Node'还是'NodeType'? –

+0

@Als:编辑。是的,它是'NodeType'。 – Cipher

回答

0

是的,这是一个有效的简单问题的答案,有三个注意事项:

  1. temp = top应该读temp = *top;
  2. 您可能要优雅地处理*top为NULL的情况(而不仅仅是取消引用NULL指针);
  3. 该解决方案当然与您获得的原型不兼容[void StackPop(Node *Top)],因为它将以Node**为参数。

我唯一的说法就是StackPop听起来应该是成员函数而不是自由函数。

+0

是的,它是一个自由函数而不是类成员函数,但会影响上面写的popping的功能(假设我们忽略了必须传递顶层节点地址的事实)? – Cipher

+0

@密码:不,功能没有区别。只是可以说是糟糕的设计。 – NPE

+0

如果不以任何方式修改原型,即使不改变为StackPop(NodeType **节点),它是可能的吗? – Cipher