Я несколько изменил этот алгоритм, чтобы позаботиться о скобках и скобках
queue<string> postEvaluation(vector<string> expression){
stack<string> operators;
queue<string> output;
for(int i = 0; i < expression.size(); i++){
if(isdigit(expression[i]))
output.push(expression[i]);
if(expression[i] == "");
if (IsOperator(expression[i])) {
/* Next, move all operators off the stack until this operator has the
* highest precedence of them all.
*/
while (!operators.empty() && IsOperator(operators.top()) &&
Precedence(operators.top()) >= Precedence(expression[i])) {
output.push(operators.top()); operators.pop();
}
/* Add the operator to the operator stack. */
operators.push(expression[i]);
}
/* Case 2: Found an open parenthesis. */
else if (expression[i] == "(" || expression[i] == "[" || expression[i] == "{" ) {
operators.push(expression[i]);
}
/* Case 3: Found a close parenthesis. */
else if (expression[i] == ")" || expression[i] == "]" || expression[i] == "}") {
/* Keep moving tokens over from the operator stack to the result until
* we find a matching open parenthesis. If we run out of tokens, then
* there must be a syntax error.
*/
while (!operators.empty() && operators.top() != "(" && !operators.empty() && operators.top() != "[" && !operators.empty() && operators.top() != "{") {
output.push(operators.top()); operators.pop();
}
/* Remove the parenthesis we matched. */
operators.pop();
}
}
/* Keep shifting all the operators back off the operator stack onto the end
* of the input. If we find an open parenthesis, then the input is
* malformed.
*/
while (!operators.empty()) {
output.push(operators.top()); operators.pop();
}
return output;
}
по какой-то причине, когда я ввожу что-то вроде: 10 — [(3 — 2) * 10] / 5
выход: 10 3 2 — 10 * — 5 /
когда выход должен быть: 10 3 2 — 10 * 5 / —
Любые идеи о том, как правильно изменить это, чтобы обрабатывать скобки {} и скобки []?
Задача ещё не решена.
Других решений пока нет …