上机题目2013.3

在这里插入图片描述

在这里#include<iostream>
using namespace std;

struct node{
	string v;
	node *r,*l;
};

void preOrder(node *t)
{
	if(t==NULL)
		return;
	cout<<t->v;
	preOrder(t->l);
	preOrder(t->r);
}
//中序转二叉树 
void in2T(string in,node *&t)
{
	if(t==NULL)
	{
		t = new node;
		t->l=t->r=NULL;
	}
	int op = 9999;  //上次的最小优先级 
	int idx = -1;  //最小优先级的运算符的位置 
	int ex = 0;  // 当前计算的优先级,只是考虑括号
	//考虑a-b*c;
	//如果遇到运算符,ex也改变,则‘*’ex=2, '-'ex=3;
	//就会出现‘*’成为优先级最低,错误
	//没有括号的表达式中,从相同的起点ex=0,进行比较
	//有括号的表达式中ex+2,再以ex+s为起点比较 
	//由后向前扫描 
	for(int i=in.length()-1;i>=0;i--) 
	{
		if(in[i]==')') //进入括号 
		{
			ex+=2;
		}
		else if(in[i]=='(') //出括号
		{
			ex-=2;	
		} 
		else if(in[i]=='+'||in[i]=='-')
		{
			if(ex+1<op)
			{
				idx=i;
				op = ex+1;
			}
		}
		else if(in[i]=='*'||in[i]=='/')
		{
			if(ex+2<op)
			{
				idx =i;
				op = ex +2;
			}
		}
	}
	if(idx==-1)  //表达式中只有括号或者数字,没有运算符
	{
		//先处理括号 可能出现(((a)))的情况 
		int idx1,idx2;
		for(idx1=0;idx1<in.length();idx1++)
		{
			if(in[idx1]!='(')
				break;	
		}	
		for(idx2=in.length()-1;idx2>=0;idx2--)
		{
			if(in[idx2]!=')')
				break;
		}
		t->v = in.substr(idx1,idx2-idx1+1);
		return; 
	} 
	t->v=in[idx];
	in2T(in.substr(0,idx),t->l);
	in2T(in.substr(idx+1,in.length()-idx-1),t->r);
} 

int main()
{
	string in;
	getline(cin,in);
	node *root =NULL;
	in2T(in,root);
	preOrder(root);
	cout<<endl;
	return 0;
}

插入代码片
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值