请各位大佬们赐教,目前该程序支持非负整数的四则运算仅支持"(“和”)",可以叠加多层。
#include <iostream>
#include <stack>
using namespace std;
bool isdigit(char a) {
//判断字符串中的字符是不是数字
return a <= '9' && a >= '0';
}
int fd(char a) {
//返回优先度
if (a == '*' || a == '/') {
return 3;
}
else if (a == '+' || a == '-') {
return 2;
}
else if (a == '@') {
return -1;
}
else if (a == '(') {
return 1;
}
else if (a == ')') {
return 4;
}
}
int cla(int a, int b, char chart) {
//计算仅支持四则运算
switch (chart)
{
case '*':
return a * b;
case '/':
return a / b;
case '+':
return a + b;
case '-':
return a - b;
default:
break;
}
}
int claee(string instr) {
//先将运算式子转化成后缀表达式,将数据两端将加上#
//遇到数字直接转化,遇到运算符需要判断优先顺序
stack<char> ops;
//放置运算符的栈,栈底放置@
ops.push('@');
//hstr储存后缀表达式
string hstr = "";
char digitp = '#';
int n = instr.length();
for (int i = 0; i < n; i++) {
//用于调试查看
//cout << i << "hstr:" << hstr << endl;
if (isdigit(instr[i])) {
//遇到数字时
//添加数字前的#
if(i==0)hstr += digitp;
if (i > 0 && !isdigit(instr[i - 1])) {
hstr += digitp;
}
//直接加入后缀表达式中
hstr += instr[i];
//添加数字后的#
if (i < n-1 && !isdigit(instr[i + 1])) {
hstr += digitp;
}
if (i == n - 1) {
hstr += digitp;
}
}
else {
if (instr[i] == '(') {
ops.push(instr[i]);
continue;
}
else if (instr[i] == ')') {
while (ops.top() != '(') {
hstr += ops.top();
ops.pop();
}
ops.pop();
}
else {
while (fd(instr[i]) <= fd(ops.top())) {
hstr += ops.top();
ops.pop();
}
ops.push(instr[i]);
}
}//not digit
}//for
//清空运算符
while (ops.top() != '@') {
hstr += ops.top();
ops.pop();
}
int n2 = hstr.length();
int i = 0;
bool isd = false;//标记i是不是在数字范围内
int num = 0;
stack<int> stn;
//转成后缀
cout << "后缀表达式为:" << hstr << endl;
while (i < n2) {
//cout << i << endl;
if (hstr[i] == '#') {
if (isd) {//遇到数字的后一个#
stn.push(num);
num = 0;
isd = false;
}
else isd = true;//遇到数字的前一个#
}
else if (isdigit(hstr[i])) {
num *= 10;
num += (hstr[i] - '0');
}
else {
//遇到运算符则立马进行计算
int a = stn.top();
stn.pop();
int b = stn.top();
stn.pop();
int temp = cla(b, a, hstr[i]);
stn.push(temp);
}
i++;
}
int ans = stn.top();
return ans;
}
int main()
{
//已测试成功输入
//string instr = "3*(4+2)/6-54+3*44";
//string instr = "(4+2)+2+(3*34-2)";
//string instr = "(4+2)";
//string instr = "4+2";
//string instr = "43+23*33";
//int ans = claee(instr);
//cout << "ans:" << ans << endl;
string instr;
while (cin>>instr) {
cout << claee(instr) << endl;
}
return 0;
}