【发布时间】:2021-10-19 20:24:25
【问题描述】:
我正在尝试使用 C++ 中的链表来实现堆栈。当我运行我的代码时,没有任何东西输出到控制台,但它编译没有错误。问题似乎来自我指向顶部节点的指针。我最初在没有指针的情况下创建了顶部节点,但是当我尝试将其初始化为 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;
}
【问题讨论】:
-
在 set_prev 中你为什么不接受
Node*并将prev设置为那个?同样在pushnew_node将在函数结束时被销毁。您应该使用动态分配。此外,我看不出您如何在*prev = nd处没有遇到段错误,因为prev从未初始化过。是的,在取消引用top之前进行了测试和段错误。该程序没有输出任何东西,因为它事先崩溃了 -
@Lala5th 关于段错误,应该没问题,因为在初始化之前从未访问过 prev。
-
那么你在初始化之前取消引用它。
prev和*prev不是一回事。要初始化prev,您需要newmalloc或其他方式来创建可以放置Node的内存。鉴于 linux 内核有这样的说法,段错误也绝对是一个问题:segmentation fault (core dumped)new_node.set_prev(*top)行处@ -
编译没有错误仅仅意味着语法是正确的。不过,这与逻辑是否正确无关。这是您学习使用调试器单步执行代码的最佳时机,这样您就可以跟踪执行路径并查看发生了什么以及您的逻辑哪里出错了。
-
你不能在不了解
new之前安全地使用它。