(实验)编写程序处理输入的表达式字符串,返回表达式的值。要求如下:
①表达式中至少包含加、减、乘、除、取余操作;
②表达式以#作为开始和结束符,其中包含括号。
③表达式能处理多位整数。
#include<iostream>
#include<stack>
using namespace std;
//计算
int Calculate(int a, int b, char op) {
switch (op) {
case '+':
return a + b;
case '-':
return b - a;
case '*':
return a * b;
case '/':
return b / a;
case '%':
return b % a;
}
return 0;
}
//定义第一个符号的大小
int Isp(char ch) {
switch (ch) {
case '#':
return 0;
case '(':
return 1;
case '+':
return 3;
case '-':
return 3;
case '*':
return 5;
case '/':
return 5;
case '%':
return 5;
case ')':
return 6;
default:
return -1;
}
}
//定义第二个符号的大小
int Osp(char ch) {
switch (ch) {
case '#':
return 0;
case '(':
return 8;
case '+':
return 2;
case '-':
return 2;
case '*':
return 4;
case '/':
return 4;
case '%':
return 4;
case ')':
return 1;
default:
return -1;
}
}
int main() {
stack<char>s1;
stack<int>s2;
int i = 1;
char s[20];
cout << "以#开始和结尾的计算式\n";
cin.getline(s, 20);
s1.push('#');
while (s[i] != '#') {
if (s[i] >= '0' && s[i] <= '9') {
s2.push(s[i] - 48); //将字符串转化为数字
}
else {
if (s[i] == ')') {
while (s1.top() != '(') {
char w;
w = s1.top();
s1.pop();
int z, r, h;
z = s2.top();
s2.pop();
r = s2.top();
s2.pop();
h = Calculate(z, r, w);
s2.push(h);
continue;
}
if (s1.top() == '(') {
s1.pop();
i++;
continue;
}
}
else {
if (Isp(s1.top()) >= Osp(s[i])) {
char w;
w = s1.top();
s1.pop();
int z, r, h;
z = s2.top();
s2.pop();
r = s2.top();
s2.pop();
h = Calculate(z, r, w);
s2.push(h);
s1.push(s[i]);
}
else {
s1.push(s[i]);
}
}
}
i++;
}
while (s1.top() != '#') {
char w;
w = s1.top();
s1.pop();
int z, r, h;
z = s2.top();
s2.pop();
r = s2.top();
s2.pop();
h = Calculate(z, r, w);
s2.push(h);
continue;
}
cout << s2.top();
}