使用链表C++堆栈
C++ stack using linked lists
我正在尝试使用链表实现一个简单的堆栈。当我运行下面的代码时,我得到
6
<some random integer>
我已经在寻找我的错误几个小时了,但没有成功。我想某处有一个未外行的变量,但我似乎找不到它。
#include <iostream>
using namespace std;
class node {
public:
node operator = (const node&);
node(int d,node* n): data(d), prev(n) {}
node(){}
node* prev;
int data;
};
node node::operator = (const node &n) {
node r(n.data, n.prev);
return r;
}
class stack {
public:
stack();
void push(int);
int pop();
bool empty();
private:
node* top;
};
stack::stack() {
top = 0;
}
bool stack::empty() {
return top == 0;
}
void stack::push(int x) {
node n(x,top);
top = &n;
}
int stack::pop() {
if (!empty()) {
node r = *top;
//cout << "r.data: " << r.data << endl;
top = top->prev;
return r.data;
}
else {
cout << "Stack empty!" << endl;
return 0;
}
}
int main() {
stack a;
a.push(5);
a.push(6);
cout << a.pop() << endl;
cout << a.pop() << endl;
}
现在完全让我困惑的是,当我取消注释该行时
//cout << "r.data: " << r.data << endl;
出于测试目的,输出更改为
r.data: 6
6
r.data: 6
6
为什么会这样呢?
这段代码是错误的:
void stack::push(int x) {
node n(x,top);
top = &n;
}
在这里,您创建一个局部变量,然后将top
设置为指向该变量。但是当函数返回时,局部变量不再存在,并且top
指向一些无效的内存。
您需要使用 new
运算符在堆上创建一个新node
:
void stack::push(int x) {
node* n = new node(x,top);
top = n;
}
当然,现在您必须确保分配的节点在完成后是空闲的。这应该在弹出所有节点的 stack
析构函数中完成,pop
您需要使用 delete
运算符来释放内存。
除非这是类的编程作业,否则请使用 STL 提供的 std::stack。
void stack::push(int x) {
node n(x,top);
top = &n;
}
此函数的问题在于 n 具有自动存储持续时间,并且在函数返回后被销毁。
请改用动态分配:
node* n = new node(x, top);
相关文章:
- 算法问题:查找从堆栈中弹出的所有序列
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么调用堆栈数组会导致内存泄漏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 堆栈和队列是否像C++中的数组一样传递?
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 从堆栈分配的原始指针构造智能指针
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 堆栈中大小变量输入错误 (C++)
- 堆栈问题(平衡表达式问题集)
- C++ 在堆栈中包含多态属性的类对象存储
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 在 C++ 中使用链表进行堆栈
- 变量周围的堆栈'...'已损坏
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- C++线程的可用堆栈大小