华为2012校招成都市站8:00最后一题,表达式计算源代码

华为2012校招成都站8:00最后一题,表达式计算源代码

主要是数字可能是多位数,需要处理!本程序没有做异常处理,要求表达式串正确!

其中有两个内部循环代码是重复的,最好写成一个函数,这里就不改了

转载 请保留链接 http://blog.csdn.net/challenge_c_plusplus/article/details/7982076

/*表达式计算-华为校招
Author : Milo.Wang
Date : 2012/9/15
*/
#include <iostream>
#include <cstring>
using namespace std;

void Expr(const char *expr, int *ret)
{
	char expr1[1024];
	char expr2[1024];
	strcpy(expr1,expr);
	strcpy(expr2,expr);
	int opds[1024];
	char oprs[1024];
	int idxd = 0, idxr = 0;
	int opd_idx = -1;
	char * p = strtok(expr1,"()*+-");
	while(p != NULL)
	{
		opds[idxd++] = atoi(p);
		p = strtok(NULL,"()*+-");
	}
	int i;
	int digit_flag = true;
	for(i = 0; expr2[i] != '\0'; ++i)
	{
		switch(expr2[i])
		{
		case '(':
		case ')':
		case '+':
		case '-':
		case '*':
			digit_flag = true;
			oprs[idxr++] = expr2[i];
			break;
		default:
			if(digit_flag)
			{
				digit_flag = false;
				oprs[idxr++] = '#';//特殊符号,标示有一个数字
			}
		}
	}
	oprs[idxr++] = '\0';

	int opd_stack[1024];
	char opr_stack[1024];
	int opd_top = -1;
	int opr_top = -1;
	int opdr,opdl;
	for(i = 0; i < idxr; ++i)
	{
		char ch;
		switch((ch = oprs[i]))
		{
		case '*':
		case '(':
			opr_stack[++opr_top] = ch;
			break;
		case '+':
		case '-':
			while(opr_top > -1 && opr_stack[opr_top] == '*')
			{
				--opr_top;
				opdr = opd_stack[opd_top--];
				opdl = opd_stack[opd_top--];
				opd_stack[++opd_top] = opdl * opdr;
			}
			opr_stack[++opr_top] = ch;
			break;
		case ')':
			while(opr_top > -1 && opr_stack[opr_top] != '(')
			{
				opdr = opd_stack[opd_top--];
				opdl = opd_stack[opd_top--];
				char c;
				int result;
				switch((c = opr_stack[opr_top--]))
				{
				case '*':
					result = opdl * opdr;
					break;
				case '+':
					result = opdl + opdr;
					break;
				case '-':
					result = opdl - opdr;
					break;
				}
				opd_stack[++opd_top] = result;
			}
			if(opr_stack[opr_top] == '(')
				--opr_top;
			break;
		case '\0':
			while(opr_top > -1)
			{
				opdr = opd_stack[opd_top--];
				opdl = opd_stack[opd_top--];
				char c;
				int result;
				switch((c = opr_stack[opr_top--]))
				{
				case '*':
					result = opdl * opdr;
					break;
				case '+':
					result = opdl + opdr;
					break;
				case '-':
					result = opdl - opdr;
					break;
				}
				opd_stack[++opd_top] = result;
			}
			break;
		case '#':
			opd_stack[++opd_top] = opds[++opd_idx];
		}
	}
	*ret = opd_stack[opd_top];
}
int main(int argc, char *argv[])
{
	const char *str = "5+6*(5-2)-10";
	int ret;
	Expr(str,&ret);
	cout << str << " = " << ret << endl;
	return 0;
}