#include <bits/stdc++.h> using namespace std; #define MAXSIZE 1001 int tot; struct Node{ string data; int lchild; int rchild; int fchild; }node[MAXSIZE]; int stack_num[MAXSIZE];//下标数组 int stack_op[MAXSIZE];//运算符数组 int top_num; int top_op; int op_rank[255]; int makenode(string x){ tot++; node[tot].data=x; node[tot].lchild=0; node[tot].rchild=0; node[tot].fchild=0; return tot; }//叶子节点的构造 int maketree(int a,int b,char c){ tot++; node[tot].data=c; node[tot].lchild=a; node[tot].rchild=b; node[tot].fchild=0; node[a].fchild=tot; node[b].fchild=tot; return tot; }//叶子结点构造树 void print_tree(int x){ if(x==0) return; print_tree(node[x].lchild); print_tree(node[x].rchild); cout<<node[x].data<<' '; }//后序遍历 void push_num(int num){ top_num++; stack_num[top_num]=num; } int pop_num(){ return stack_num[top_num--]; } void push_op(char c){ top_op++; stack_op[top_op]=c; } char pop_op(){ return stack_op[top_op--]; } void solve(){ char c=pop_op(); while(c!='('){ int b=pop_num(); int a=pop_num(); push_num(maketree(a,b,c)); c=pop_op(); } } void judge_op(char c){ if(op_rank[c]>op_rank[stack_op[top_op]]||top_op==0){ push_op(c); return; } char x=pop_op(); int b=pop_num(); int a=pop_num(); push_num(maketree(a,b,x)); judge_op(c); } void clearstack(){ while(top_op!=0){ char c=pop_op(); int b=pop_num(); int a=pop_num(); push_num(maketree(a,b,c)); } } int main(){ op_rank['(']=1; op_rank['+']=2; op_rank['-']=2; op_rank['*']=3; op_rank['/']=3; op_rank[')']=4; string s; getline(cin,s); s=s+'@'; tot=0; string s_num; for(int i=0;i<s.size();i++){ switch(s[i]){ case '@': if(s_num!="") push_num(makenode(s_num)); clearstack(); break; case'(': push_op('('); solve(); break; case '+': case '-': case '*': case '/': if(s_num!="") push_num(makenode(s_num)); s_num=""; judge_op(s[i]); break; default: s_num+=s[i]; break; } } print_tree(pop_num()); return 0; }修改此代码使能输出结果
时间: 2023-11-28 17:49:04 浏览: 104
您好,我看出来这是一个表达式求值的代码,但是现在的代码只输出了表达式的后序遍历结果,并没有进行求值。如果您想让程序输出表达式的结果,可以按照以下步骤进行修改:
1. 在节点结构体中添加一个值域,用来存储节点的计算结果:
```c++
struct Node{
string data;
int lchild;
int rchild;
int fchild;
int value; // 添加一个值域,用来存储节点的计算结果
}node[MAXSIZE];
```
2. 修改 `makenode()` 函数,在创建一个数字节点时,将该节点的值域初始化为该数字的值:
```c++
int makenode(string x){
tot++;
node[tot].data=x;
node[tot].lchild=0;
node[tot].rchild=0;
node[tot].fchild=0;
if(isdigit(x[0])){ // 如果是数字节点,则将值域初始化为该数字的值
node[tot].value=stoi(x);
}
return tot;
}
```
3. 修改 `solve()` 函数,在计算完一个操作符节点的值之后,将该节点的计算结果存储到其值域中:
```c++
void solve(){
char c=pop_op();
while(c!='('){
int b=pop_num();
int a=pop_num();
int res;
switch(c){ // 根据操作符计算两个子树的值
case '+': res=node[a].value+node[b].value; break;
case '-': res=node[a].value-node[b].value; break;
case '*': res=node[a].value*node[b].value; break;
case '/': res=node[a].value/node[b].value; break;
}
push_num(maketree(a,b,c)); // 创建一个新的操作符节点,并将其值域设置为该节点的计算结果
node[tot].value=res;
c=pop_op();
}
}
```
4. 最后,在 `main()` 函数中,输出根节点的值域即可:
```c++
cout << node[pop_num()].value << endl;
```
完整代码如下:
阅读全文