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();
}