利用顺序栈实现表达式的求解。使用c++编写
时间: 2023-08-02 19:07:19 浏览: 94
顺序栈的c++实现
以下是使用C++实现顺序栈求解表达式的示例代码:
```c++
#include <iostream>
#include <stack>
#include <string>
#include <cmath>
using namespace std;
// 判断是否为数字
bool is_digit(char c) {
return (c >= '0' && c <= '9');
}
// 运算符优先级
int priority(char op) {
if (op == '+' || op == '-') {
return 1;
} else if (op == '*' || op == '/') {
return 2;
} else if (op == '^') {
return 3;
}
return 0;
}
// 计算二元运算表达式
double calculate(double a, double b, char op) {
if (op == '+') {
return a + b;
} else if (op == '-') {
return a - b;
} else if (op == '*') {
return a * b;
} else if (op == '/') {
return a / b;
} else if (op == '^') {
return pow(a, b);
}
return 0;
}
// 计算后缀表达式
double evaluate_postfix(string postfix) {
stack<double> s;
for (int i = 0; i < postfix.length(); i++) {
if (is_digit(postfix[i])) {
// 数字直接入栈
s.push(postfix[i] - '0');
} else {
// 运算符出栈两个数计算结果后再入栈
double b = s.top();
s.pop();
double a = s.top();
s.pop();
s.push(calculate(a, b, postfix[i]));
}
}
return s.top();
}
// 将中缀表达式转换为后缀表达式
string infix_to_postfix(string infix) {
string postfix = "";
stack<char> s;
for (int i = 0; i < infix.length(); i++) {
if (is_digit(infix[i])) {
// 数字直接输出
postfix += infix[i];
} else if (infix[i] == '(') {
// 左括号入栈
s.push(infix[i]);
} else if (infix[i] == ')') {
// 出栈直到遇到左括号
while (!s.empty() && s.top() != '(') {
postfix += s.top();
s.pop();
}
s.pop();
} else {
// 运算符,比较优先级出栈
while (!s.empty() && priority(s.top()) >= priority(infix[i])) {
postfix += s.top();
s.pop();
}
s.push(infix[i]);
}
}
// 输出栈中剩余元素
while (!s.empty()) {
postfix += s.top();
s.pop();
}
return postfix;
}
int main() {
string infix = "3+4*5/(1-2)^2^3";
string postfix = infix_to_postfix(infix);
cout << "Infix expression: " << infix << endl;
cout << "Postfix expression: " << postfix << endl;
double result = evaluate_postfix(postfix);
cout << "Result: " << result << endl;
return 0;
}
```
示例输入:
```
3+4*5/(1-2)^2^3
```
示例输出:
```
Infix expression: 3+4*5/(1-2)^2^3
Postfix expression: 345*12-23^^/+
Result: 3.00012
```
阅读全文