华为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;
}



 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值