您的位置:首页 > 其它

华为机试—四则运算(数组解决)

2014-12-26 11:11 711 查看
题目:四则运算

问题描述:

输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值

注:

3.1、表达式只含 +, -, *, / 四则运算符,不含括号

3.2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况

3.3、要考虑加减乘除按通常四则运算规定的计算优先级

3.4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生

3.5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况



要求实现函数:

int calculate(int len,char *expStr)

【输入】 int len: 字符串长度;char *expStr: 表达式字符串;

【输出】 无

【返回】 计算结果



示例:

1)输入:char *expStr = “1+4*5-8/3”

函数返回:19

2)输入:char *expStr = “8/3*3”

函数返回:6



问题分析:

题目要求很简单,只是计算个位数的四则运算,且没有括号。主要考察栈的运用,实现时采用两个辅助栈,一个用来存放操作数,一个用来存放操作符。根据操作符的优先级进行计算。这个题目在严蔚敏《数据结构》这本书将栈的时候详细介绍了实现过程。

基本思路:

两个数组分别存储操作数和操作符,扫描输入的字符串,当遇到*和/的时候,边计算边存储,将计算结果存到操作数的数组中,当遇到+和-号时只存储不计算。当所有数据存储完毕后,因为运算就只剩下+-运算了,因为+-符合交换原则,所以用类似于栈的方式,从数组末尾开始运算,同时每次将运算结果存储操作数的数组中,最后四则运算的结果就是操作数的数组中剩下的那个。

具体实现:

#include <iostream>
using namespace std;

int calculate(int len,char *expStr)
{
	int result =0;
    int*  datas = new int[len];   //用数组模拟操作数栈
    char* opers = new char[len];  //用数组模拟操作符栈

    int dataTop = -1;
    int operTop = -1;
    memset(datas,0,len*sizeof(int));
    memset(opers,0,len*sizeof(char));

    for(int i=0;i<len;++i)
	{
		if(expStr[i] >= '0' && expStr[i] <= '9')
			datas[++dataTop] = expStr[i]-'0';
		if(expStr[i] == '+' || expStr[i] == '-' || expStr[i] == '*' || expStr[i] == '/')
		{
			char oper = expStr[i];
			if(oper =='*' || oper =='/')
			{
				int num1 = datas[dataTop--];
				int num2 = expStr[++i]-'0';
				if(oper  =='*')
					num1*= num2;
				else if(oper =='/')
					num1/=num2;
				datas[++dataTop] = num1;
			}
			else
				opers[++operTop] = expStr[i];
		}
	}

	while(operTop!=-1)
	{
		char oper = opers[operTop--];
		int num1 = datas[dataTop--];
		int num2 = datas[dataTop--];
		if(oper == '+')
			num2+=num1;
		else if(oper =='-')
			num2-=num1;
		datas[++dataTop]=num2;
	}

	result = datas[dataTop];

	return result;
}

int main()
{
	char a[100];
	while(cin>>a){
		int len = strlen(a);
		cout<<calculate(len,a)<<endl;
	}
	cout<<endl;
	return 0;
}


测试结果,可能想的不周全,欢迎查漏补缺:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: