📄 shiyan2-a.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<iostream.h>
#include<string.h>
//定义一棵二叉树
char number[50];
int n,bit;
enum NodeType{based_num,num,basechar,digit};
class BinNode{
public:
int it;
NodeType type;
int base;
BinNode* lc;
BinNode* rc;
BinNode()
{lc=rc=NULL;}
BinNode(int c,BinNode* l,BinNode* r)
{it=c;lc=l;rc=r;}
~BinNode(){ }
void setval(const int& c)
{it=c;}
void setLeft(BinNode* l)
{lc=l;}
void setRight(BinNode* r)
{rc=r;}
BinNode* LeftChild()const
{return lc; }
BinNode* RightChild()const
{return rc; }
void set(const char& c,BinNode* l,BinNode* r)
{it=c;lc=l;rc=r;}
void setType(NodeType t)
{ type=t;}
void setbase(const int& b)
{ base=b;}
};
BinNode* Based_Num(void);
BinNode* Basechar(void);
BinNode* Num(void);
BinNode* Digit(void);
BinNode* Based_Num(void)
{
BinNode* temp;
temp=Num();
temp=new BinNode(-1,temp,Basechar());
temp->setType(based_num);
return temp;
}
BinNode* Basechar(void)
{
BinNode* temp;
if(number[n-1]=='o')
{
temp=new BinNode('o',NULL,NULL);
temp->setbase(8);
}
else if(number[n-1]=='d')
{
temp=new BinNode('d',NULL,NULL);
temp->setbase(10);
}
else
fprintf(stderr,"Error\n");
temp->setType(basechar);
return temp;
}
BinNode* Num(void)
{
BinNode* temp;
if(bit!=0)
temp=new BinNode(-1,Num(),Digit());
else if(bit==0)
temp=Digit();
temp->setType(num);
return temp;
}
BinNode* Digit(void)
{
BinNode* temp;
temp=new BinNode(number[bit]-'0',NULL,NULL);
bit--;
temp->setType(digit);
return temp;
}
void travse(BinNode* root)
{
if(root==NULL)
return;
travse(root->LeftChild());
cout<<"\nval="<<root->it<<endl;
travse(root->RightChild());
}
void EvalWithBase(BinNode *root)
{
if(root==NULL)
return;
NodeType t;
BinNode *r,*l;
l=root->LeftChild();
r=root->RightChild();
t= root->type;
switch(t){
case based_num:
EvalWithBase(r);
l->setbase(r->base);
EvalWithBase(l);
root->setval(l->it);
break;
case num:
if(l!=NULL)
{
l->setbase(root->base );
EvalWithBase(l);
if(r!=NULL)
{
r->setbase(root->base);
EvalWithBase(r);
if(l->it!=-1&&r->it!=-1)
{
int n=(root->base)*(l->it)+r->it;
root->setval(n);
}
else
root->setval(-1);
}
else
root->setval(l->it);
}
break;
case basechar:
break;
case digit:
if(root->base==8&&root->it>7)
{
root->setval(-1);
cout<<"错误!!八制进中不能出现8或9\n";
return;
}
break;
}
}
void main()
{
cout<<"输入表达式\n";
cout<<"以o(八进制)或d(十进制)结尾\n";
cin>>number;
n=strlen(number);
bit=n-2;
BinNode* root;
root=Based_Num();
cout<<"中序遍历:\n";
travse(root);
EvalWithBase(root);
cout<<"结果为: "<<root->it<<endl;
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -