【问题标题】:C++ stack using linked lists使用链表的 C++ 堆栈
【发布时间】:2012-09-30 00:04:52
【问题描述】:

我正在尝试使用链表实现一个简单的堆栈。当我运行下面的代码时,我得到了

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

为什么会这样?

【问题讨论】:

  • 你真的应该阅读一下c++中变量的scope

标签: c++ list pointers linked-list stack


【解决方案1】:

这段代码是错误的:

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 运算符来释放内存。

【讨论】:

  • 是的!谢谢。将其更改为: node *n = new node(x,top);顶部 = n;现在可以使用了。
【解决方案2】:

除非这是针对某个类的编程作业,否则请使用 STL 提供的std::stack。

【讨论】:

    【解决方案3】:
    void stack::push(int x) {
        node n(x,top);
        top = &n;
    }
    

    这个函数的问题是n有自动存储时长,函数返回后销毁。

    改为使用动态分配:

    node* n = new node(x, top);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-01
      • 2012-10-14
      • 2012-10-25
      • 2017-12-23
      • 2012-05-24
      • 2019-03-04
      • 2020-01-16
      相关资源
      最近更新 更多