我正在尝试使用 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
该类的指针成员。在使用指针引用的对象之前,必须将指针设置为指向有效对象。
显示的代码中没有任何内容似乎设置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()
应该使用指向 a 的指针调用new_node
,而不是将它的(副本)传递给set_prev()
。然而,问题远未结束。new_node
是在自动范围内声明的对象。此函数返回后,new_node
被销毁。任何现有的指向它的指针现在都指向一个被破坏的、不再有效的对象,并且取消引用它会进一步导致未定义的行为,以及另一个很可能崩溃的情况。
很明显,根据上下文,这里的意图是Node
使用new
关键字在动态范围内实例化一个新对象。因此,pop()
对delete
他们来说也是如此。
这种作业分配传统上是在引入动态作用域的概念,并在动态作用域中使用new
和delete
创建对象后给出的。您应该查看课堂笔记或教科书材料,以获取有关此主题的更多信息,以及有关如何正确、正确地创建和销毁对象的更多详细信息;以及正确使用指针。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句