1

ツリーへのポインタのプッシュダウンスタックを作成しました。ユーザーが接尾辞に方程式を入力すると、プログラムは方程式をツリーとして保存します(つまり以下のように)

34 * 7 + 58+12*は等しい

   ----+----        ---+---      ---*---
   |        |       |     |      |     |
---*---     7       5     8      1     2
|     |
3     4

ただし、現時点では、複数のノードのツリーを保存しようとすると(+または*が検出された場合)、前のツリーが上書きされます。つまり、上記の式は次のスタックになります。

 ---+---      ---+---       ---*---
 |     |      |     |       |     |
 1     2      1     2       1     2

私のコードは次のとおりです。

#include <iostream>
using namespace std;

struct node
{
    char info; struct node *r, *l;
};


class Stack
{
    private:
        node *stack;
        int p;
    public:
        Stack (int max = 100)
            { stack = new node[max]; p=0; }
       ~Stack ()
            { delete stack;}
        inline void push(node item)
            { 
                stack[p] = item;
                p++;
            }
        inline node pop()
            { 
                p--;                
                return stack[p];
            }
        inline int empty ()
            { return !p; }
};

void tree(const char *ltr)
{
    struct node *z;
    Stack stack(50);
    z = new node;
    z->l =z; z->r =z;z->info='a';
    while(*ltr)
    {
        while (*ltr == ' ')
        {
            ltr ++;
        }
        struct node *x;
        x = new node;
        x ->info = *ltr; 
        if ( (*ltr == '+' || *ltr == '*') && !stack.empty())
        {
            x->r=&stack.pop();
            x->l=&stack.pop();          
        }else{
            x->l = z; x->r = z;
        }
        stack.push(*x);
        ltr++;
    }
}

int main()
{
    char word[100];
    cin.get(word, 100);
    cin.ignore(100, '\n');
    tree(word);
    cin.get();
}

x-> r =&stack.pop();の場合のようです。実行されると、前のすべてのノード->rが上書きされます。ただし、node-> infoは変更されておらず、zノードもツリーに影響を与えません。

私が何が起こっているのか、そして私が今数時間間違ったことを何をしているのかを解明しようとしてきたことを誰かが知っていますか?

よろしくサム


修正

非再帰的トラバース型関数(スタックオーバーフローにつながる問題による再帰)を使用しているコードをテストするために、このコードは少し厄介ですが、これを実行して次のように入力すると、以下に含まれます:

12+ 34 * 56+

あなたは私が持っている問題を見るでしょう、それは言うべきです:

aa5 + aa3 * aa1 +

しかし、代わりに以下を生成します:

aa5 + aa5 * aa5 +

#include <iostream>
using namespace std;

struct node
{
    char info; struct node *r, *l;
};

void traverse3(struct node *tree)
{
    {
        cout << tree->info;
    }
}
void traverse2(struct node *tree)
{
    {
        traverse3(tree->r);
        cout << tree->info;
    }
}
void traverse1(struct node *tree)
{
    {
        traverse2(tree->r);
        cout << tree->info;
    }
}

void traverse(struct node *tree)
{
    {
        traverse1(tree->r);
        cout << tree->info;
    }
}

class Stack
{
    private:
        node *stack;
        int p;
    public:
        Stack (int max = 100)
            { stack = new node[max]; p=0; }
       ~Stack ()
            { delete stack;}
        inline void push(node item)
            { 
                stack[p] = item;
                p++;
            }
        inline node pop()
            { 
                p--;                
                return stack[p];
            }
        inline int empty ()
            { return !p; }
};

void tree(const char *ltr)
{
    struct node *z,*c;
    Stack stack(50);
    z = new node;
    z->l =z; z->r =z;z->info='a';
    while(*ltr)
    {
        while (*ltr == ' ')
        {
            ltr ++;
        }
        struct node *x;
        x = new node;
        x ->info = *ltr; 
        if ( (*ltr == '+' || *ltr == '*') && !stack.empty())
        {
            x->l = &stack.pop();
            x->r = &stack.pop();
        }else{
            x->l = z; x->r = z;
        }
        stack.push(*x);
        ltr++;
    }
    c = new node;
    int q;
    for(q=0; q<3; q++)
    {
    *c = stack.pop();
    traverse(c);
    }
}

int main()
{
    char word[100];
    cin.get(word, 100);
    cin.ignore(100, '\n');
    tree(word);
    cin.get();
}
4

0 に答える 0