Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 堆栈推送操作实现不工作_C++_Pointers_Stack_Implementation - Fatal编程技术网

C++ 堆栈推送操作实现不工作

C++ 堆栈推送操作实现不工作,c++,pointers,stack,implementation,C++,Pointers,Stack,Implementation,我正在编写自己的堆栈来练习语言和指针。我使用链表来表示堆栈,而不是数组。push操作只是将top nodes值分配给每个节点,我不明白为什么,我尝试编写了一个赋值操作符,但它没有做任何事情 template <class T> void stack<T>::push(T data) { //Operation to preform if the stack is empty. //Root element is popped off last (First in, La

我正在编写自己的堆栈来练习语言和指针。我使用链表来表示堆栈,而不是数组。push操作只是将top nodes值分配给每个节点,我不明白为什么,我尝试编写了一个赋值操作符,但它没有做任何事情

template <class T>
void stack<T>::push(T data) {

//Operation to preform if the stack is empty.
//Root element is popped off last (First in, Last out)
if ( empty() ) {
root_node = new node;
root_node->node_data = data;
root_node->next = nullptr;
elements++;
 }

//Operation to preform if stack is not empty.
//Elements inserted into stack with dynamic allocation.
else  {
node *new_node = new node; 


/* PROBLEM AREA */

new_node = root_node; 
root_node->next = new_node;                  
root_node->node_data = data;                 

elements++;
 }
按10、20、40、30并弹出并调用top()时的输出


你按错误的顺序做了其他部分(你的问题所在)的作业。第二条语句立即关闭了新分配的节点。你应该做的是:

node *new_node = new node;
new_node->node_data = data;
new_node->next = root_node->next;
root_node = new_node;
elements++;

重载的
运算符=
是错误的。你有:

node operator=(const node &rhs) {
因此,它按值返回一个副本。您没有定义复制构造函数,因此这将是一个“浅复制”,这将导致问题

定义
运算符=
的常用方法是

node& operator=(const node &rhs) {
但是,此函数中的逻辑也没有意义:

    if ( this != &rhs) {
    this->next = rhs->next;
    this->node_data = rhs->node_data;
    }
现在您将有两个节点,它们都指向相同的
下一个
。因此,你不再有一个列表,你有某种颠倒的树正在进行


您应该实现或删除拷贝构造函数,以消除发生意外浅拷贝的可能性


另一个大问题是:

node *new_node = new node; 
new_node = root_node; 
您创建了一个
新节点
,但随后立即泄漏内存,并使
新节点
指向
根节点
。根据你的描述,我猜你的意思是:

*new_node = *root_node;
这意味着
new\u node->operator=(*根节点)调用
操作符=
函数


总而言之,整件事都是一团糟,你最好从头开始重做。我建议将代码分为两部分:

  • 链表
  • 堆栈逻辑
单独编写链接列表并检查其是否有效。(这应该是一个类)


完成后,您可以在链表顶部执行堆栈实现。

“这是我得到的输出,如果…”uhhm什么?我找不到任何输出样本?(正确格式化代码,避免任何滚动条,也可能有助于提高可读性!!)
new\u node=root\u node
您刚才分配的
新节点
现在将永远丢失。感谢您的建议。已编辑。您的
根节点
从未更改,但
根节点->节点数据=数据不断变化data@Revoo将一个新节点分配给
new\u node
,在下一行将
root\u node
分配给
new\u node
,没有任何其他内容指向新节点,因此无法再检索该节点。segfault来自重载的赋值运算符(正如@matt mcnabb的答案中所指出的。答案很好!我忽略了我在这里使用指针而不是节点对象的事实。我假设语句*new_node=*root_node反引用指针并将节点值分配给另一个?是的,这就是它的作用。如果分配指针,则意味着使一个指针指向另一个指针指向;但如果指定非指针对象,则它将调用目标的
运算符=
node *new_node = new node; 
new_node = root_node; 
*new_node = *root_node;