⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shiyan2-a.cpp

📁 这是一个用来生成表达工的值的程序 它可以输入8进制或十进制的数 建立一棵语法树 并返回表达式的值
💻 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 + -