#include <iostream>
#include <vector>
#include <stack>
using namespace std;
bool isPrior(char ch1, char ch2)
{
if(ch1 == '(' || ch2 == '(')
{
return true;
}
if((ch1 == '*' || ch1 == '/') && (ch2 == '+' || ch2 == '-'))
{
return true;
}
return false;
};
vector<char> infixToPostfix(vector<char> infixExpression)
{
vector<char> postfixExpression;
stack<char> operators;
for(char ch : infixExpression)
{
if(ch >= '0' && ch <= '9')
{
postfixExpression.push_back(ch);
}
else
{
if(operators.empty() || isPrior(ch, operators.top()))
{
operators.push(ch);
}
else if(ch == ')')
{
while(operators.top() != '(')
{
postfixExpression.push_back(operators.top());
operators.pop();
}
operators.pop();
}
else
{
while(!operators.empty() && !isPrior(ch, operators.top()))
{
postfixExpression.push_back(operators.top());
operators.pop();
}
operators.push(ch);
}
}
}
while(!operators.empty())
{
postfixExpression.push_back(operators.top());
operators.pop();
}
return postfixExpression;
};
int computePostfixExpression(vector<char> postfixExpression)
{
stack<int> operands;
int leftOperand, rightOperand;
for(char ch : postfixExpression)
{
if (ch >= '0' && ch <= '9')
{
operands.push(ch - '0');
}
else
{
rightOperand = operands.top();
operands.pop();
leftOperand = operands.top();
operands.pop();
switch (ch)
{
case '+' :
operands.push(leftOperand + rightOperand);
break;
case '-' :
operands.push(leftOperand - rightOperand);
break;
case '*' :
operands.push(leftOperand * rightOperand);
break;
case '/' :
operands.push(leftOperand / rightOperand);
break;
}
}
}
return operands.top();
};
int main()
{
vector<char> infixExpression{'(', '(', '2', '+', '3', ')', '*', '8', '+', '5', '+', '6', ')', '*', '6'};
cout << computePostfixExpression(infixToPostfix(infixExpression)) << endl;
return 0;;
}
C++ 中缀表达式转后缀表达式
最新推荐文章于 2024-04-12 09:59:55 发布