求助:要求输入一个中缀表达式,并用这个表达式创建一个二叉树
要求是:要求输入一个中缀表达式,并用这个表达式创建一个二叉树,然后以后序遍历去计算值
我用了两个工作栈,EXPT存根节点,OPTR存符号,按照符号优先级操作,可是好像在生成树的时候就出问题了……苦思冥想还是想不出来,求各位大神帮帮忙
#include<iostream>
using namespace std;
#define MAXTSIZE 100
typedef char SqBiTree[MAXTSIZE];
SqBiTree bt;
typedef struct bitnode
{
char data;
struct bitnode *lchild, *rchild;
}bitnode, *bitree;
typedef struct StackNode
{
char data;
struct StackNode *next;
}StackNode, *LinkStack;//StackNode是结点,LinkStack是链栈
typedef struct StackNode1111
{
bitree data;
struct StackNode1111 *next;
}StackNode1111, *LinkStack1111;//StackNode是结点,LinkStack是链栈
LinkStack OPTR;
LinkStack1111 EXPT;
bitree T;
void InitStack(LinkStack &S)
{
S = NULL;
}//初始化链栈
void InitStack1(LinkStack1111 &S)
{
S = NULL;
}//初始化链栈
void Push(LinkStack &S, char e)
{
StackNode *p = new StackNode; //生成新结点
p->data = e;
p->next = S;
S = p;//栈顶指针改为p
}//入栈
void Push1(LinkStack1111 &S, bitree e)
{
StackNode1111 *p = new StackNode1111; //生成新结点
p->data = e;
p->next = S;
S = p;//栈顶指针改为p
}//入栈
char GetTop(LinkStack S)//取栈顶元素
{
if (S != NULL)
return S->data;
}
bool In(char n)
{
if (n != '+' || n != '-' || n != '*' || n != '/' || n != '(' || n != ')'||n!='#')
return false;
else return true;
}//判断n是不是运算符,如果不是运算符,返回false,否则true
char Precede(char OPTRtop, char ch)
{
{
if (ch == '+' || ch == '-' || ch == '*' || ch == '/')
{
if (OPTRtop == '(')
return '<';
else if ((ch == '+' || ch == '-') && (OPTRtop == '*' || OPTRtop == '/'))
return '>';
else if ((ch == '*' || ch == '/') && (OPTRtop == '*' || OPTRtop == '/'))
return '>';
else if ((ch == '*' || ch == '/') && (OPTRtop == '+' || OPTRtop == '-'))
return '<';
}
else if (ch == '(')
return '<';
else if (ch == ')'||ch=='#')
return '>';
else if (OPTRtop == '(' && ch == ')')
return '=';
}
}//当优先级
void CreateExpTree(bitree &T, char a, char b, char c)
{
T->data = c;
T->lchild->data = a;
T->rchild->data = b;
}
void Pop(LinkStack1111 &S,bitree &k)
{
StackNode1111 *p = new StackNode1111;//生成临时结点
if (S == NULL) return;//栈空
p = S;
k = S->data;
S = S->next;//栈顶指向栈的后一个结点
delete p;//删除原栈顶
}//出栈
void Pop1(LinkStack &S, char &k)
{
StackNode *p = new StackNode;//生成临时结点
if (S == NULL) return;//栈空
p = S;
k = S->data;
S = S->next;//栈顶指向栈的后一个结点
delete p;//删除原栈顶
}//出栈
void Pop2(LinkStack1111 &S, char &k)
{
StackNode1111 *p = new StackNode1111;//生成临时结点
if (S == NULL) return;//栈空
p = S;
k = S->data->data;
S = S->next;//栈顶指向栈的后一个结点
delete p;//删除原栈顶
}//出栈
bitree InitExpTree()
{
char ch,theta,a,b,x;
int i = 0;
InitStack1(EXPT);
InitStack(OPTR);
Push(OPTR, '#');
cin >> ch;
while (ch != '#' || GetTop(OPTR) != '#')
{
bitree T;
if (!In(ch))
{
CreateExpTree(T, NULL, NULL, ch);
Push1(EXPT, T);
cin >> ch;
}
else
{
switch (Precede(GetTop(OPTR), ch))
{
case'<':
Push(OPTR, ch);
cin >> ch;
break;
case'>':
Pop1(OPTR, theta);
Pop2(EXPT, b); Pop2(EXPT, a);
CreateExpTree(T, a, b, theta);
Push1(EXPT, T);
break;
case'=':
Pop1(OPTR, x);
cin >> ch;
break;
}
}
}
bitree T;
Pop(EXPT, T);
return T;
}
int GetValue(char ch, int a, int b)
{
if (ch == '+')
return a + b;
else if (ch == '-')
return a - b;
else if (ch == '*')
return a*b;
else if (ch == '/')
return a / b;
}
int EvaluateExpTree(bitree T)
{
int lvavlue=0 , rvalue = 0;
if (T->lchild == NULL&&T->rchild == NULL)
return T->data - '0';
else
{
lvavlue = EvaluateExpTree(T->lchild);
rvalue = EvaluateExpTree(T->rchild);
return GetValue(T->data, lvavlue, rvalue);
}
}
int main()
{
bitree T;
T = InitExpTree();
cout << "表达式树的后序遍历计算值为" << endl;
cout << EvaluateExpTree(T) << endl;
}