利用表达树计算字符串的值



#include <iostream>//可以把str和a数组包裹成结构数组
#include <string>
using namespace std;

typedef struct CalTree* pCalTree;
struct CalTree
{
	int num;
	char c;
	pCalTree left;
	pCalTree right;
	CalTree():c('&'){}
};

char str[30]={0};/原始
int  priority[30]={0};//优先级对应数组
void str_deal();//输入字符串和处理优先级
void PreOrder(pCalTree b);//先序遍历的递归算法
pCalTree creat(char *t,int* at);//创建表达树
int CalPreOrder(pCalTree b);

int main(int argc, char const *argv[])
{
	str_deal();
	pCalTree head=creat(str,priority);
	cout<<CalPreOrder(head);
	return 0;
}
void str_deal()//输入字符串和处理优先级
{
	gets(str);//
	int kuohao=0;//用于括号里的操作符号升级
	int length=strlen(str);
	for (int i = 0; i < length; ++i)
	{
		switch(str[i])
		{
		case'-':priority[i]=1+kuohao;break;
		case'+':priority[i]=1+kuohao;break;
		case'*':priority[i]=2+kuohao;break;
		case'/':priority[i]=2+kuohao;break;
		case'(':kuohao+=2;break;
		case')':kuohao-=2;break;
		default:priority[i]=32767;		
		}    	
	}
	int j=0;
	for ( int i = 0; i < length; ++i)//去掉括号
	{
		if (str[i]=='(' || str[i]==')')
			continue;	   	
		else
		{
			str[j++]=str[i];
			priority[j-1]=priority[i];    
		}
	}
	str[j]='\0';//补尾
}
pCalTree creat(char *t,int* at)
{
	pCalTree temp=new CalTree;	
	int length=strlen(t);
	int min=32767,minPos=0;//最小优先级坐标;

	bool isNumber = true;
	int num = 0;
 	for (int i = 0; i < length; ++i)
 	{
 		if (t[i] >= '0' && t[i] <= '9')
 		{
 			num *= 10;
 			num += (t[i] - '0');
 		}
 		else
 		{
 			isNumber = false;
 			break;
 		}
 	}


	if (isNumber)//this is a number;
	{
		temp->num = num;//一开始这里错了temp->c=t[1];
		temp->left=NULL;
		temp->right=NULL;
	}
	else
	{
		for (int i = 0; i < length; ++i)
		{
			if (at[i]<min)/找到第一个最小的优先级符号
			{
				min=at[i];///错误:这句忘记了
				minPos=i;
			}
		}
		temp->c=t[minPos];//第一个最小的优先级符号
		t[minPos]='\0';///把此位置设置为空

		temp->left=creat(t,at);	
		temp->right=creat(t+minPos+1,at+minPos+1);///指针开头
	}
	return temp;
}
void PreOrder(pCalTree b)//先序遍历的递归算法
{
	if (b!=NULL)  
	{ 
		PreOrder(b->left);  //递归访问左子树
		PreOrder(b->right);  //递归访问右子树
		
		if (b->c == '&')
			cout << b->num << " ";
		else
			cout << b->c << " ";

	}
}


int CalPreOrder(pCalTree b)
{
	if (b->left == NULL && b->right == NULL)
		return b->num;
	switch (b->c)
	{
	case '+': return CalPreOrder(b->left) + CalPreOrder(b->right);break;
	case '-': return CalPreOrder(b->left) - CalPreOrder(b->right);break;
	case '*': return CalPreOrder(b->left) * CalPreOrder(b->right);break;
	case '/': return CalPreOrder(b->left) / CalPreOrder(b->right);break;

	}
	return 1;
}


http://blog.csdn.net/h1023417614/article/details/18151903

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值