0

リンクされたリストを使用して単純なスタックを実装しようとしています。以下のコードを実行すると、

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

なぜそれが起こるのでしょうか?

4

3 に答える 3

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演算子を使用してメモリを解放する必要があります。

于 2012-10-09T15:48:41.483 に答える
3

これがクラスのプログラミング割り当てでない限り、 STL で提供されるstd::stackを使用します。

于 2012-10-09T16:01:43.877 に答える
0
void stack::push(int x) {
    node n(x,top);
    top = &n;
}

この関数の問題点は、 n には自動保存期間があり、関数が戻った後に破棄されることです。

代わりに、動的割り当てを使用します。

node* n = new node(x, top);
于 2012-10-09T15:55:03.403 に答える