gpt4 book ai didi

c++ - 如何让这个链表堆栈实现在 C++ 中运行?

转载 作者:行者123 更新时间:2023-12-04 14:05:06 26 4
gpt4 key购买 nike

我正在尝试使用 C++ 中的链表实现堆栈。当我运行我的代码时,没有任何内容输出到控制台,但编译时没有错误。问题似乎来 self 的顶级节点指针。我最初创建了没有指针的顶级节点,但是当我试图将其初始化为 NULL 时,这本身就产生了问题。

代码:

#include <iostream>
using namespace std;
class Stack{

class Node{
int data;
Node* prev;
public:
Node(int x){
data=x;
}
void set_prev(Node nd){
*prev=nd;
}
Node get_prev(){
return *prev;
}
int get_data(){
return data;
}
};

Node* top = NULL;
int count = 0;

public:
void push(int x){
Node new_node(x);
new_node.set_prev(*top);
*top = new_node;
count++;
cout << "Pushing" << endl;
}
void pop(){
if(!is_empty()){
int data = (*top).get_data();
*top = (*top).get_prev();
count--;
cout << "Popping" << endl;
}else{
cout << "Stack is empty." << endl;
}

}
int peek(){
return (*top).get_data();
}

int get_count(){
return count;
}

bool is_empty(){
return !count;
}

};

int main(){
Stack stk;
stk.push(5);
stk.push(13);
cout << stk.peek() << endl;
}

最佳答案

显示的代码中存在多个与指针和对象在 C++ 中的工作方式相关的基本错误。这不仅仅是一个问题或错误,必须解决所有这些问题才能正常工作。

Node* prev;

这是 Node 类的指针成员。在使用指针引用的对象之前,必须将指针设置为指向有效对象。

显示的代码中没有任何内容似乎将 prev 设置为指向任何有效的 Node 对象。

void set_prev(Node nd){
*prev=nd;
}

这将一个对象分配给 prev 指针引用的对象。 prev 指针从未被初始化为指向任何对象、任何地方。因此它的值是未初始化的、随机的垃圾。分配给由随机指针引用的对象,未初始化的垃圾是未定义的行为,并且几乎可以保证崩溃。

很明显,通过检查其余代码,这里的目的是将一个指针传递给另一个Node对象,而不是 Node 对象本身;然后将 prev 指针设置为传入的指针值。

        Node new_node(x);
new_node.set_prev(*top);

因此,在这里,应该使用指向 new_node 的指针调用 set_prev(),而不是将其(的拷贝)传递给 set_prev( )。然而,问题远未结束。 new_node 是在自动范围内声明的对象。此函数返回后,new_node 被销毁。指向它的任何现有指针现在都指向一个已销毁的、不再有效的对象,并且取消引用它会进一步导致未定义的行为,并且很可能会导致另一个崩溃。

很明显,根据上下文,这里的目的是使用 new 关键字在动态范围内实例化一个新的 Node 对象。因此,pop() 也应该删除它们。

这种作业通常是在引入动态范围的概念并使用newdelete 在动态范围内创建对象后给出的。您应该查看您的类笔记或教科书 Material ,以获取有关此主题的更多信息,以及有关如何正确、正确地创建和销毁对象的更多详细信息;以及正确使用指针。

关于c++ - 如何让这个链表堆栈实现在 C++ 中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68825619/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com