我创建了一个指向树的指针的下推堆栈。当用户在后缀中键入方程式时,程序将方程式存储为树(即如下所示)
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();
}