目录
一、前缀表达式
一.壹、概念
前缀表达式又称逆波兰式,是一位波兰数学家提出的表达方式,而且对计算机很友好,不像中缀表达式一样,计算机还得一步一步看。
一.贰、表达
前缀表达式是一种符号在前,数字在后的一种表达,如 - * 2 3 5 。
一.叁、运算
前缀表达式没有先乘除后加减、先算括号等规则,只是从左往右计算,如:
- * 2 3 5
= - 6 5
= 1
二、二叉树
二.壹、引入
有人肯能会问:为啥前缀表达式求和还要二叉树呢?因为它简单。
二.贰、概念
二叉树是指一棵树他的所有节点的子节点不超过两个。
二叉树的节点分为以下几类:根节点(通常为下标一的节点)、中间节点(有父亲节点也有子节点)、叶子节点(顾名思义,指最外面的节点,没有子节点的节点)
而二叉树又可以分为以下几个种类:普通二叉树、完全二叉树(除了最后一层,别的层都有2的层号次方个节点)、满二叉树(每层都有2的层号次方个节点)。
二.叁、初始代码
二叉树定义一般用以下代码:
struct tree{
string value;//定义值
int l=0,r=0;//定义左子节点和右子节点的下标
}t[1000];
三、代码
三.壹、思路
我们把运算符号看成根节点和中间节点,把数字看成叶子节点,在递归运算出结果。
三.贰、代码
#include<bits/stdc++.h>
using namespace std;
struct tree{
string v;
int l=0,r=0;
}t[1000];//二叉树本体,1000够用了
long long run(int x){//递归运算结果
if(t[x].v=="+")return run(t[x].l)+run(t[x].r);
if(t[x].v=="*")return run(t[x].l)*run(t[x].r);
if(t[x].v=="-")return run(t[x].l)-run(t[x].r);
int s=t[x].v.size();
long long num=0;
for(int i=0;i<s;i++)num=num*10+t[x].v[i]-'0';
return num;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int i=1;//定义编号,后面有用
string str;//输入的变量
stack<pair<int,int>>s;//用于记这个节点是谁的子节点
while(cin>>str){
t[i].v=str;
if(s.size()){//寻找父亲节点,根节点除外
pair<int,int>u=s.top();
s.pop();
if(u.second==1)t[u.first].r=i;
else{
u.second=1;
s.push(u);
t[u.first].l=i;
}
}if(str[0]>='0'&&str[0]<='9'){if(s.empty())break;}//特判跳出
else{//中间节点加入栈
pair<int,int>u;
u.first=i,u.second=2;
s.push(u);
}i++;//编号增加
}cout<<run(1);//输出结果
return 0;
}