当作练习模拟和递归的.针不戳
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=50;
typedef int LL;
char str[10000];
typedef struct BitNode* ToNode;///ToNode是结构体指针
struct BitNode{
char str;
ToNode lchild;
ToNode rchild;
};
ToNode BuildTree(LL l,LL r)
{
ToNode p=(ToNode)malloc(sizeof(BitNode));
p->lchild=nullptr;p->rchild=nullptr;
if(l==r){
p->str=str[l];
///cout<<"完成"<<endl;
return p;
}
LL posk=0;LL pluss=0;
for(LL i=l;i<=r;i++){
if(str[i]=='+'||str[i]=='-'){
pluss++;
posk=i;///找最后一个+/-的位置,使之满足节点尽可能高,先乘除后加减
}
}
if(pluss==0){
for(LL i=l;i<=r;i++){
if(str[i]=='*'||str[i]=='/'||str[i]=='X'){
posk=i;
}
}
}
p->str=str[posk];
p->lchild=BuildTree(l,posk-1);
p->rchild=BuildTree(posk+1,r);
return p;
}
void firstsearch(ToNode& L)
{
cout<<(L->str);
if(L->lchild!=nullptr) firstsearch(L->lchild);
if(L->rchild!=nullptr) firstsearch(L->rchild);
}
void midsearch(ToNode& L)
{
if(L->lchild) midsearch(L->lchild);
cout<<(L->str);
if(L->rchild) midsearch(L->rchild);
}
void finalsearch(ToNode &L)
{
if(L->lchild){
finalsearch(L->lchild);
}
if(L->rchild){
finalsearch(L->rchild);
}
cout<<L->str;
}
double cal(ToNode &L)
{
if(!(L->lchild)||!(L->rchild)){
return (L->str-'0');
}
double sum1=1.0*cal(L->lchild);
double sum2=1.0*cal(L->rchild);
double sum3=0;
if(L->str=='+'){
sum3=sum1+sum2;
}
if(L->str=='-'){
sum3=sum1-sum2;
}
if(L->str=='*'||L->str=='X'){
sum3=sum1*sum2;
}
if(L->str=='/'){
sum3=1.0*sum1/sum2;
}
return sum3;
}
int main(void)
{
cin.tie(0);std::ios::sync_with_stdio(false);
cin>>(str+1);
LL len=strlen(str+1);
ToNode L=BuildTree(1,len);
///cout<<L->str<<endl;
firstsearch(L);///先序遍历
cout<<endl;
midsearch(L);///中序遍历
cout<<endl;
finalsearch(L);///后序遍历
cout<<endl;
cout<<cal(L);
return 0;
}
Update:两位数版本
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=50;
typedef int LL;
char str[10000];
typedef struct BitNode* ToNode;///ToNode是结构体指针
///12+35+40
struct BitNode{
char str;
LL num;
ToNode lchild;
ToNode rchild;
};
bool check(LL l,LL r)
{
for(LL i=l;i<=r;i++){
if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='X'||str[i]=='/') return 0;
}
return 1;
}
LL getsum(LL l,LL r)
{
LL sum=0;
for(LL i=l;i<=r;i++){
sum=sum*10+(str[i]-'0');
}
return sum;
}
ToNode BuildTree(LL l,LL r)
{
ToNode p=(ToNode)malloc(sizeof(BitNode));
p->lchild=nullptr;p->rchild=nullptr;
if(check(l,r)==1){///判断区间内是否有符号
///p->str=str[l];
p->num=getsum(l,r);
///cout<<"完成"<<endl;
return p;
}
else if(l==r&&check(l,r)==0){
p->str==str[l];
return p;
}
LL posk=0;LL pluss=0;
for(LL i=l;i<=r;i++){
if(str[i]=='+'||str[i]=='-'){
pluss++;
posk=i;///找最后一个+/-的位置,使之满足节点尽可能高,先乘除后加减
}
}
if(pluss==0){
for(LL i=l;i<=r;i++){
if(str[i]=='*'||str[i]=='/'||str[i]=='X'){
posk=i;
}
}
}
p->str=str[posk];
p->lchild=BuildTree(l,posk-1);
p->rchild=BuildTree(posk+1,r);
return p;
}
void firstsearch(ToNode& L)
{
if(L->str=='+'||L->str=='-'||L->str=='*'||L->str=='X'||L->str=='/') cout<<L->str;
else cout<<L->num;
if(L->lchild!=nullptr) firstsearch(L->lchild);
if(L->rchild!=nullptr) firstsearch(L->rchild);
}
void midsearch(ToNode& L)
{
if(L->lchild) midsearch(L->lchild);
if(L->str=='+'||L->str=='-'||L->str=='*'||L->str=='X'||L->str=='/') cout<<L->str;
else cout<<L->num;
if(L->rchild) midsearch(L->rchild);
}
void finalsearch(ToNode &L)
{
if(L->lchild){
finalsearch(L->lchild);
}
if(L->rchild){
finalsearch(L->rchild);
}
if(L->str=='+'||L->str=='-'||L->str=='*'||L->str=='X'||L->str=='/') cout<<L->str;
else cout<<L->num;
}
double cal(ToNode &L)
{
if(!(L->lchild)||!(L->rchild)){
return (L->num);
}
double sum1=1.0*cal(L->lchild);
double sum2=1.0*cal(L->rchild);
double sum3=0;
if(L->str=='+'){
sum3=sum1+sum2;
}
if(L->str=='-'){
sum3=sum1-sum2;
}
if(L->str=='*'||L->str=='X'){
sum3=sum1*sum2;
}
if(L->str=='/'){
sum3=1.0*sum1/sum2;
}
return sum3;
}
int main(void)
{
cin.tie(0);std::ios::sync_with_stdio(false);
cin>>(str+1);
LL len=strlen(str+1);
ToNode L=BuildTree(1,len);
///cout<<L->str<<endl;
cout<<"先序遍历:"<<endl;
firstsearch(L);///先序遍历
cout<<endl;
cout<<"中序遍历"<<endl;
midsearch(L);///中序遍历
cout<<endl;
cout<<"后序遍历"<<endl;
finalsearch(L);///后序遍历
cout<<endl;
cout<<cal(L);
return 0;
}