如何在 C++ 中将此链接列表堆栈实现设为 运行?
How do I get this Linked List Stack implementation to run in C++?
我正在尝试使用 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;
}
显示的代码中存在多个与指针和对象在 C++ 中的工作方式相关的基本错误。这不仅仅是一个问题或错误,必须解决所有这些问题才能正常工作。
Node* prev;
这是Node
class的指针成员。在使用指针引用的对象之前,必须将指针设置为指向有效对象。
显示的代码中没有任何内容似乎将 prev
设置为指向任何有效的 Node
对象。
void set_prev(Node nd){
*prev=nd;
}
这会将一个对象分配给 prev
指针引用的对象。 prev
指针从未被初始化为指向任何对象、任何地方。因此它的值是未初始化的、随机的垃圾。分配给由随机指针引用的对象,未初始化的垃圾是未定义的行为,并且几乎可以保证崩溃。
很明显,通过检查其余代码,这里的目的是将一个 指针 传递给另一个 Node
对象,而不是 Node
对象本身;然后将 prev
指针设置为传入的指针值。
Node new_node(x);
new_node.set_prev(*top);
因此,在这里,set_prev()
应该使用指向 new_node
的指针来调用,而不是将其(的副本)传递给 set_prev()
。然而,问题远未结束。 new_node
是在自动范围内声明的对象。此函数 returns 后, new_node
被销毁。任何现有的指向它的指针现在都指向一个被破坏的、不再有效的对象,并且取消引用它会进一步导致未定义的行为,并且另一个很可能会崩溃。
很明显,根据上下文,此处的目的是使用 new
关键字在动态范围内实例化一个新的 Node
对象。因此,pop()
也有望 delete
他们。
这种作业传统上是在引入动态作用域的概念并使用new
和delete
在动态作用域中创建对象后给出的。您应该查看您的 class 笔记或教科书 material,以获取有关此主题的更多信息,以及有关如何正确、正确地创建和销毁对象的更多详细信息;并正确使用指针。
我正在尝试使用 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;
}
显示的代码中存在多个与指针和对象在 C++ 中的工作方式相关的基本错误。这不仅仅是一个问题或错误,必须解决所有这些问题才能正常工作。
Node* prev;
这是Node
class的指针成员。在使用指针引用的对象之前,必须将指针设置为指向有效对象。
显示的代码中没有任何内容似乎将 prev
设置为指向任何有效的 Node
对象。
void set_prev(Node nd){
*prev=nd;
}
这会将一个对象分配给 prev
指针引用的对象。 prev
指针从未被初始化为指向任何对象、任何地方。因此它的值是未初始化的、随机的垃圾。分配给由随机指针引用的对象,未初始化的垃圾是未定义的行为,并且几乎可以保证崩溃。
很明显,通过检查其余代码,这里的目的是将一个 指针 传递给另一个 Node
对象,而不是 Node
对象本身;然后将 prev
指针设置为传入的指针值。
Node new_node(x);
new_node.set_prev(*top);
因此,在这里,set_prev()
应该使用指向 new_node
的指针来调用,而不是将其(的副本)传递给 set_prev()
。然而,问题远未结束。 new_node
是在自动范围内声明的对象。此函数 returns 后, new_node
被销毁。任何现有的指向它的指针现在都指向一个被破坏的、不再有效的对象,并且取消引用它会进一步导致未定义的行为,并且另一个很可能会崩溃。
很明显,根据上下文,此处的目的是使用 new
关键字在动态范围内实例化一个新的 Node
对象。因此,pop()
也有望 delete
他们。
这种作业传统上是在引入动态作用域的概念并使用new
和delete
在动态作用域中创建对象后给出的。您应该查看您的 class 笔记或教科书 material,以获取有关此主题的更多信息,以及有关如何正确、正确地创建和销毁对象的更多详细信息;并正确使用指针。