我正在尝试使用链接列表实现一个简单的堆栈。当我运行下面的代码时,我得到了
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
为什么会这样?
答案 0 :(得分:5)
此代码错误:
void stack::push(int x) {
node n(x,top);
top = &n;
}
在这里创建一个局部变量,然后将top
设置为指向该变量。但是当函数返回时,局部变量不再存在,top
指向一些无效的内存。
您需要使用node
运算符在堆上创建新的new
:
void stack::push(int x) {
node* n = new node(x,top);
top = n;
}
当然,现在你必须确保在完成后分配的节点是免费的。这应该在弹出所有节点的stack
中的析构函数中完成,而在pop
中,您需要使用delete
运算符来释放内存。
答案 1 :(得分:3)
除非这是一个类的编程作业,否则请使用STL提供的std::stack。
答案 2 :(得分:0)
void stack::push(int x) {
node n(x,top);
top = &n;
}
此函数的问题在于n具有自动存储持续时间,并在函数返回后被销毁。
相反,请使用动态分配:
node* n = new node(x, top);