templete_calculate tree

大家看看吧,就是一个简单的字符实现四则运算的程序,并且只能是十进制的数字的四则运算,不过用到了图论的一些方法,对于复习图论来说还是不错的一道题目的,而且正好写了个模版。

贴出:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>

/*
 *这个问题是我独自想清楚的,其实只要自己动脑筋,其实许多问题都是可以解决的,下一步需要解决的就是大于10位数的
 *四则运算,这个运算只能解决一位数的四则运算还是比较不方便的。一会就得自己学着解决大数问题的四则运算。
 */ 

using namespace std;

const int MAXN = 1000;

int lch[MAXN];

int rch[MAXN];

char op[MAXN];

int nc;

int buildTree(char *s, int x, int y)
{
	int c1 = -1;
	int c2 = -1;
	int p = 0;
	if (x == y)
	{
		int u = nc++;
		lch[u] = 0;
		rch[u] = 0;
		op[u] = s[x];
		return u;
	}
	for (int i = x; i <= y; i++)
	{
		switch (s[i])
		{
			case '(' : p++; break;
			case ')' : p--; break;
			case '+' : case '-' : if (!p) c1 = i; break; //c1表示最右边的+ -的标号, 
			case '*' : case '/' : if (!p) c2 = i; break; //c2表示最右边的* /的标号。 
		}
	}
	if (c1 < 0) //如果右边没有+ -的话,那就得取* /; 
	{
		c1 = c2;
	}
	if (c1 < 0) //如果也没有* /的话,而且并不是一个简单的数字,那就说明肯定有括号。 
	{
		return buildTree(s, x + 1, y - 1);
	}
	int u = nc++;
	lch[u] = buildTree(s, x, c1 - 1);
	rch[u] = buildTree(s, c1 + 1, y);
	op[u] = s[c1];
	return u;
}

void init()
{
	nc = 0;
}

int BFS(int root) // BFS求解BFS的结果(仔细想,问题非常的奇妙) 
{
	switch (op[root])
	{
		case '+' : return BFS(lch[root]) + BFS(rch[root]); break;
		case '-' : return BFS(lch[root]) - BFS(rch[root]); break;
		case '*' : return BFS(lch[root]) * BFS(rch[root]); break;
		case '/' : return BFS(lch[root]) / BFS(rch[root]); break;
	}
	return op[root] - '0';
}

int main()
{
	char str[123]; 
	while (scanf("%s", str) != EOF)
	{
		
		init();
		int len = strlen(str);
		int root = buildTree(str, 0, len - 1);
		/*
		for (int i = 0; i < nc; i++)
		{
			printf("i = %d op[i] = %c\n", i, op[i]);
		}
		*/
		int ans = BFS(root);
		/*
		int o1, o2;
		int ans = op[0] - '0';
		int cnt = 0;
		while (cnt + 2 < nc)
		{
			cnt += 2;
			switch (op[cnt])
			{
				case '+' : ans += op[cnt - 1] - '0'; break;
				case '-' : ans -= op[cnt - 1] - '0'; break;
				case '*' : ans *= op[cnt - 1] - '0'; break;
				case '/' : ans /= op[cnt - 1] - '0'; break;
			}
		}
		//这样的方法是不行的 例如2+4*2 
		*/
		printf("ans = %d\n", ans);
	}
	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值