问题描述:
输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值
注:
1、表达式只含 +, -, *, / 四则运算符,不含括号
2、表达式数值只包含个位整数(0-9),且不会出现 0 作为除数的情况
3、要考虑加减乘除按通常四则运算规定的计算优先级
测试范例:
输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值
注:
1、表达式只含 +, -, *, / 四则运算符,不含括号
2、表达式数值只包含个位整数(0-9),且不会出现 0 作为除数的情况
3、要考虑加减乘除按通常四则运算规定的计算优先级
4、除法用整数除法,即仅保留除法运算结果的整数部分。比如 8/3=2。
#include<iostream>
#include<stack>
#include<stdexcept>
using namespace std;
int cerr_flag=0;
int calculate(int len, char* str)
{
stack<int> Num;
stack<char> Symbol;
bool bFlag = false;
char c,OperSymbol;
int temp;
int num1, num2;
for (int i = 0; i < len; i++)
{
c = str[i];
if (isdigit(c))
{
temp = c - '0';
Num.push(temp);
continue;
}
else if (c == '*' || c == '/')
{
if (Symbol.size() > 0 && (Symbol.top() == '*' || Symbol.top() == '/'))
bFlag = true;
else
bFlag = false;
}
else if (c == '+'||c=='-')
{
if (Symbol.size() == 0)
bFlag = false;
else
bFlag = true;
}
if (bFlag)
{
num1 = Num.top();
Num.pop();
num2 = Num.top();
Num.pop();
OperSymbol = Symbol.top();
Symbol.pop();
switch (OperSymbol)
{
case '+':
temp = num2 + num1;
Num.push(temp);
break;
case '-':
temp = num2 - num1;
Num.push(temp);
break;
case '*':
temp = num2 * num1;
Num.push(temp);
break;
case '/':
try{
if (num1 == 0)
throw invalid_argument("除数为0");
}
catch (const invalid_argument& e)
{
cerr << "捕获异常:" << e.what() << endl;
cerr_flag = 1;
return NULL ;
}
temp = num2 / num1;
Num.push(temp);
break;
default:
break;
}
}
Symbol.push(c);
}
while (Symbol.size() > 0)
{
num1 = Num.top();
Num.pop();
num2 = Num.top();
Num.pop();
OperSymbol = Symbol.top();
Symbol.pop();
switch (OperSymbol)
{
case '+':
temp = num2 + num1;
Num.push(temp);
break;
case '-':
temp = num2 - num1;
Num.push(temp);
break;
case '*':
temp = num2 * num1;
Num.push(temp);
break;
case '/':
try{
if (num1 == 0)
throw invalid_argument("除数为0");
}
catch (const invalid_argument& e)
{
cerr << "捕获异常:" << e.what() << endl;
cerr_flag = 1;
return NULL;
}
temp = num2 / num1;
Num.push(temp);
break;
default:
break;
}
}
return Num.top();
}
测试范例:
1+4*4-8/4 ——> 13
2-9/0+2*3 ——> 捕获异常,除数为0
int main()
{
char *a = "1+4*4-8/2";
char *b = "2-9/0+2*3";
int result1 = calculate(strlen(a), a);
if (cerr_flag == 0)
{
cout << "运算结果为:" << result1<<endl;
}
cout << endl;
int result2 = calculate(strlen(b), b);
if (cerr_flag == 0)
{
cout << "运算结果为:" << result2;
}
return 0;
}