Это код c ++ для оценки выражения инфикса. Мой код дает правильный вывод, когда я помещаю выражение инфикса непосредственно в код, но когда я беру выражение от пользователя и затем передаю это выражение, код не дает правильный ответ, я не могу понять, почему. Я использовал свой собственный файл стека. Если бы вы могли найти мою ошибку и исправить мой код. Спасибо.
#include <iostream>
#include"stacklink.h"
#include"stacklink.cpp"
#include<bits/stdc++.h>
using namespace std;
int precedence(char op){
if(op == '+'||op == '-')
return 1;
if(op == '*'||op == '/')
return 2;
return 0;
}
int applyOp(int a, int b, char op){
switch(op){
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b;
}
}
int evaluate(string tokens){
int i;
StackType <int> values;
StackType <char> ops;
for(i = 0; i < tokens.length(); i++){
if(tokens[i] == ' ')
continue;
else if(tokens[i] == '('){
ops.Push(tokens[i]);
}
else if(isdigit(tokens[i])){
int val = 0;
while(i < tokens.length() &&
isdigit(tokens[i]))
{
val = (val*10) + (tokens[i]-'0');
i++;
}
values.Push(val);
}
else if(tokens[i] == ')')
{
while(!ops.IsEmpty() && ops.Top() != '(')
{
int val2 = values.Top();
values.Pop();
int val1 = values.Top();
values.Pop();
char op = ops.Top();
ops.Pop();
values.Push(applyOp(val1, val2, op));
}
if(!ops.IsEmpty())
ops.Pop();
}
else
{
while((!ops.IsEmpty()) && precedence(ops.Top())
>= precedence(tokens[i])) {
int val2 = values.Top();
values.Pop();
int val1 = values.Top();
values.Pop();
char op = ops.Top();
ops.Pop();
values.Push(applyOp(val1, val2, op));
}
ops.Push(tokens[i]);
}
}
while(!ops.IsEmpty()){
int val2 = values.Top();
values.Pop();
int val1 = values.Top();
values.Pop();
char op = ops.Top();
ops.Pop();
values.Push(applyOp(val1, val2, op));
}
return values.Top();
}
int main() {
//cout << evaluate("10 + 2 * 6") << "\n";
//cout << evaluate("10 + 3 * 5 / ( 16 - 4 )") << "\n";
//cout << evaluate("100 * ( 2 + 12 )") << "\n";
//cout << evaluate("100 * ( 2 + 12 ) / 14");
string infix;
cin>>infix;
cout<< evaluate(infix);
return 0;
}