1、 用程序实现波兰符号法。 实现功能:输入波兰符号法公式,求出公式类型 输入:波兰符号法的数学计算公式或命题公式 输出:输出公式类型。用c/c++
时间: 2024-02-23 12:57:52 浏览: 149
逆波兰式计算,将格式化数组转化为逆波兰表达式,a为输入的数组,n为其长度,p为输出逆波兰表达式的目标
好的,下面是一个实现波兰符号法计算的C++程序示例:
```c++
#include <iostream>
#include <string>
#include <stack>
#include <cmath>
using namespace std;
// 判断一个字符串是否为数字
bool is_number(const string& s) {
for (const char& c : s) {
if (!isdigit(c)) {
return false;
}
}
return true;
}
// 计算波兰符号法表达式的值
double calc_polish(const string& input_string) {
stack<double> s;
for (const string& token : input_string) {
if (is_number(token)) { // 如果是数字,直接压入栈中
s.push(stod(token));
} else { // 如果是运算符,弹出两个数进行计算,并将结果压入栈中
double arg2 = s.top();
s.pop();
double arg1 = s.top();
s.pop();
if (token == "+") {
s.push(arg1 + arg2);
} else if (token == "-") {
s.push(arg1 - arg2);
} else if (token == "*") {
s.push(arg1 * arg2);
} else if (token == "/") {
s.push(arg1 / arg2);
} else if (token == "^") {
s.push(pow(arg1, arg2));
} else if (token == "sqrt") {
s.push(sqrt(arg2));
} else {
return NAN;
}
}
}
return s.top();
}
// 判断一个字符是否为运算符
bool is_operator(const char& c) {
if (c == '+' || c == '-' || c == '*' || c == '/' || c == '^' || c == 's') {
return true;
} else {
return false;
}
}
// 判断一个字符是否为左括号
bool is_left_parenthesis(const char& c) {
if (c == '(') {
return true;
} else {
return false;
}
}
// 判断一个字符是否为右括号
bool is_right_parenthesis(const char& c) {
if (c == ')') {
return true;
} else {
return false;
}
}
// 将中缀表达式转换成波兰符号法
string infix_to_polish(const string& input_string) {
stack<char> s;
string output_string;
for (const char& c : input_string) {
if (isdigit(c)) { // 如果是数字,直接输出
output_string += c;
} else if (is_operator(c)) { // 如果是运算符
while (!s.empty() && !is_left_parenthesis(s.top()) && (c != '^' || s.top() != '^') && (c != 's' || s.top() != 's') && ((c != '*' && c != '/') || (s.top() != '+' && s.top() != '-'))) {
output_string += s.top();
s.pop();
}
s.push(c);
} else if (is_left_parenthesis(c)) { // 如果是左括号,直接压入栈中
s.push(c);
} else if (is_right_parenthesis(c)) { // 如果是右括号,弹出栈中的元素直到遇到左括号
while (!s.empty() && !is_left_parenthesis(s.top())) {
output_string += s.top();
s.pop();
}
if (!s.empty() && is_left_parenthesis(s.top())) {
s.pop();
} else {
return "";
}
}
}
while (!s.empty()) { // 将栈中剩余的元素依次输出
if (is_operator(s.top()) || is_left_parenthesis(s.top()) || is_right_parenthesis(s.top())) {
return "";
}
output_string += s.top();
s.pop();
}
return output_string;
}
int main() {
// 测试波兰符号法计算
string input_string = "- * 8 4 / 16 2";
string polish_string = infix_to_polish(input_string);
if (polish_string != "") {
double result = calc_polish(polish_string);
if (!isnan(result)) {
cout << "输入的波兰符号法公式\"" << input_string << "\"的计算结果为" << result << "。" << endl;
} else {
cout << "输入的波兰符号法公式\"" << input_string << "\"不合法。" << endl;
}
} else {
cout << "输入的波兰符号法公式\"" << input_string << "\"不合法。" << endl;
}
// 测试中缀表达式转换成波兰符号法
string input_string2 = "2+3*4/(1-5)^2";
string polish_string2 = infix_to_polish(input_string2);
if (polish_string2 != "") {
cout << "中缀表达式\"" << input_string2 << "\"转换成的波兰符号法为\"" << polish_string2 << "\"。" << endl;
} else {
cout << "中缀表达式\"" << input_string2 << "\"不合法。" << endl;
}
return 0;
}
```
输入波兰符号法公式后,程序会根据输入的运算符进行计算,并输出计算结果。如果输入的波兰符号法公式不合法,则输出提示信息。同时,程序还实现了将中缀表达式转换成波兰符号法的功能,可以用于将普通算术表达式转换成波兰符号法。
阅读全文