2013 华为招聘上机第三题 表达式求值

2013年华为成都地区招聘的上机测试题目三,是求给定表达式的值,如 3*(2+1)-(5+4), 最终输出0

题目中的符号只有+ - * /  ( )

以下是这道题的一个C++代码实现,写得不够简洁,实现的方案可能不是太好。最终功能能够实现

#include <iostream>
#include <string>
#include <stack>
#include <cmath>

using namespace std;

stack<int> optn;
stack<char> optr;

stack<char> numTmp;

int getPiority(char ch)
{
	int pio = 0;
	
	switch(ch)
	{
		case '+':
		case '-':
			pio = 2;
			break;
		case '*':
		case '/':
			pio = 3;
			break;
		case '(':
			pio = 1;
			break;
		case ')':
			pio = 4;
			break;
		default:
			break;
	}

	return pio;

}

int compare(char a, char b)
{
	int res = getPiority(a) - getPiority(b);

	return res;
}

int calculate(int a, int b, char ch)
{
	switch(ch)
	{
	case '+':
		return a + b;
		break;
	case '-':
		return a - b;
		break;
	case '*':
		return a*b;
		break;
	case '/':
		return a/b;
		break;
	default:
		return 0;
		break;
	}
}

void main()
{
	string expStr;
	cin>>expStr;
	int len = expStr.length();
	for (int i = 0; i < len; i++)
	{
		if (expStr.at(i) >= '0' && expStr.at(i) <= '9')
		{
			int num = 0;

			//获取操作数
			while (i < len && expStr.at(i) >= '0' && expStr.at(i) <= '9')
			{
				numTmp.push(expStr.at(i));
				i++;
			}
			i--;

			int size = numTmp.size();
			for (int j = 0; j < size; j++)
			{
				num += (numTmp.top() - '0') * pow(10, j);
				numTmp.pop();
			}
			optn.push(num);
		}
		else 
		{
			if (optr.empty())
			{
				//操作符栈为空则直接放入操作符
				optr.push(expStr.at(i));
			}
			else 
			{
				//操作符为'('则直接放入
				if (expStr.at(i) == '(')
				{
					optr.push(expStr.at(i));
				}
				else
				{
					//若当前操作符为')',则弹出两个操作数与一个操作符计算,直到遇到'('停止,并弹出'('
					if (expStr.at(i) == ')')
					{
						for (char ch = optr.top(); ch != '('; )
						{
							int num1 = optn.top();
							optn.pop();
							
							int num2 = optn.top();
							optn.pop();
							
							int result = calculate(num2, num1, optr.top());
							optn.push(result);
							optr.pop();
							if (optr.empty())
							{
								break;
							}
							ch = optr.top();
						}

						//弹出'('
						optr.pop();

					}
					//若为运算符,则进行优先级比较,进而作运算
					else if (compare(expStr.at(i), optr.top()) <= 0)
					{
						//若当前运算符比操作符栈栈顶操作符的优先级要低,
						//则弹出栈顶运算符及两个操作数进行计算
						while (compare(expStr.at(i), optr.top()) <= 0)
						{
							int num1 = optn.top();
							optn.pop();
							
							int num2 = optn.top();
							optn.pop();
							
							int result = calculate(num2, num1, optr.top());
							optn.push(result);
							optr.pop();
							if (optr.empty())
							{
								break;
							}
						}

						//再将当前运算符入栈
						optr.push(expStr.at(i));
					}

					//当前运算符优先级高于操作符栈顶元素
					else 
					{
						optr.push(expStr.at(i));
					}
				}				
			}
		}

	}
	
	//最终若操作符栈不为空,则一直按照之前的方式计算
	//此时运算符优先级肯定是由栈顶到栈底逐渐减小
	while (!optr.empty())
	{
		int num1 = optn.top();
		optn.pop();
		
		int num2 = optn.top();
		optn.pop();
		
		int result = calculate(num2, num1, optr.top());
		optn.push(result);
		optr.pop();

	}

	//输出最终操作数栈的元素
	cout<<optn.top();
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值