实验内容:用程序实现波兰符号法。
实现功能:输入波兰符号法公式,求出公式的值
输入:波兰符号法的数学计算公式或命题公式
输出:输出公式值。
输入公式的符号说明:
序号 | 联结词 | 程序替代符号 |
1 | ¬ | ! |
2 | ∧ | & |
3 | ∨ | | |
4 | → | - |
5 | ↔ | = |
6 | () | () |
#include<iostream>
using namespace std;
char s[100];
int nums[100];
int z;
int pre1(char str[]) {
z = strlen(str);
for (int i = 0; i < z; i++) {
int sum = 0;
int len = 0;
int FLAG = 0;
if (str[i] =='(') {
if (str[i + 1] == '-') {
FLAG = 1;
for (int j = i + 1; j < z - 1; j++) {
str[j] = str[j + 1];
}
z--;
}
for (int j = i + 1; j < z; j++) {
len++;
if (str[j] == ')') break;
sum = 10 * sum + str[j] - '0';
}
if (FLAG == 1)sum = -sum;
str[i] = '1';
nums[i] = sum;
for (int j = i + 1; j < z - len; j++)str[j] = str[j + len];
z -= len;
}
}
int F1 = 0, F2 = 0;
int x, y;
char t;
int flag=0;
int f = 0;
while (z != 1) {
F1 = 0, F2 = 0;
x = 0, y = 0;
for (int i = 0; i < z; i++) {
if (str[i] == '1') {
if (F1 == 1 && F2 == 0) {
flag = i;
y = nums[i];
F2 = 1;
}
if (F1 == 0) {
x = nums[i];
F1 = 1;
}
}
else {
F1 = 0;
F2 = 0;
f = i;
t = str[i];
}
}
int tmp = 0;
if (t == '+')
tmp = x + y;
else if (t == '-')
tmp = x - y;
else if (t == '*')
tmp = x * y;
else if (t == '/')
tmp = x / y;
flag -= 2;
z -= 2;
nums[f] = tmp;
str[flag] = '1';
for (int i = flag + 1; i < z; i++)
{
str[i] = str[i + 2];
}
/*for (int i = 0; i < z; i++)
{
cout << str[i];
}
cout << endl;
for (int i = 0; i < z; i++)
cout << nums[i];
cout << endl;*/
}
return nums[0];
}
int pre2(char str[]) {
int z = strlen(str);
for (int i = 0; i < z; i++) {
if (str[i] >= '0' && str[i] <= '9' && str[i] != '0')
str[i] = '1';
if (str[i] == '!') {
if (str[i + 1] == '1')
str[i + 1] = '0';
else if (str[i + 1] == '0')
str[i + 1] = '1';
for (int j = i; j < z - 1; j++) {
str[j] = str[j + 1];
}
z--;
}
}
int F1 = 0, F2 = 0;
int x, y;
char t;
int flag = 0;
while (z != 1) {
F1 = 0, F2 = 0;
x = 0, y = 0;
for (int i = 0; i < z; i++) {
if (str[i] == '0'|| str[i] == '1') {
if (F1 == 1 && F2 == 0) {
flag = i;
y = str[i] - '0';
F2 = 1;
}
if (F1 == 0) {
x = str[i] - '0';
F1 = 1;
}
}
else {
t = str[i];
}
}
int tmp = 0;
if (t == '&')tmp = x * y;
else if (t == '|') {
if (x + y >= 1) tmp = 1;
}
else if (t == '-') {
if (x == 1) tmp = 0;
else tmp = 1;
}
else if (t == '=') {
if (x == y)tmp = 1;
else tmp = 0;
}
flag -= 2;
z -= 2;
str[flag] = tmp + '0';
for (int i = flag + 1; i < z; i++)
{
str[i] = str[i + 2];
}
}
return str[0] - '0';
}
int judge(char str[]) {
for (int i = 0; i < strlen(str); i++)
{
if (str[i] == '&' || str[i] == '|' || str[i] == '!' || str[i] == '=')
return 1;
}
return 0;
}
int main() {
cin >> s;
if (judge(s)) {
cout << pre2(s);
}
else {
cout << pre1(s);
}
return 0;
}
输出样例:
1.
中缀表达式:((2+(2×2))×1+3)÷(3×3)
前缀表达式:÷+×+2×2213*33
2.