Написание функции для вычисления постфиксного выражения
Я не получаю оцененный результат постфиксного выражения. Я реализовал его в c++. Здесь я добавил функцию, которую я сделал для того, чтобы оценить выражение.
Но, похоже, что оцененный результат не печатается.Может ли кто-нибудь сказать, что не так с этим кодом?
Что я уже пробовал:
void Evaluate_infix::postfix_eval() { int i=0; char a,b,res; while(postfix[i]!='\0') { if((int)postfix[i]>=49 && (int)postfix[i]<=57) { operand.push(postfix[i]); i++; } else if( postfix[i]=='+') { a=operand.pop();; a=a-48; b=operand.pop(); b=b-48; (char)res=a+b; operand.push(res); i++; } else if( postfix[i]=='-') { a=operand.pop(); a=a-48; b=operand.pop(); b=b-48; (char)res=a-b; operand.push(res); i++; } else if( postfix[i]=='*') { a=operand.pop(); a=a-48; b=operand.pop(); b=b-48; (char)res=a*b; operand.push(res); i++; } else if( postfix[i]=='/') { a=operand.pop(); a=a-48; b=operand.pop(); b=b-48; res=a/b; operand.push(res); i++; } else if( postfix[i]=='^') { a=operand.pop(); a=a-48; b=operand.pop(); b=b-48; res=a^b; operand.push(res); i++; } } cout<<"\nPostfix Evaluation : "; cout<<static_cast<int>(operand.arr[operand.top])<
Rick York
У меня нет для тебя решения, только вопросы. Этот код неполон и выглядит довольно сомнительно. Почему из каждого значения вычитается 48? Если у вас есть символ и вы вычитаете "0", чтобы получить его двоичное значение, то почему он был сохранен в качестве значения ASCII в первую очередь? Кроме того, почему все это работает на одном персонаже? Это не даст правильных результатов, если у вас есть значение больше десяти.
Наконец, комментарий : отладчик должен показать вам все, что вам нужно для решения этой проблемы. Если в вашей среде разработки его нет, то получите тот, который есть. Есть несколько доступных альтернатив.
Nandini Sathyan S
Могу ли я тогда загрузить полный код? Я надеюсь, что вы можете понять@Rick York
Rick York
Нет. Ты не можешь. Вы можете отредактировать свой вопрос, чтобы иметь код, но не ожидайте, что кто-то будет копаться во всем этом. Я знаю, что не собираюсь этого делать.
Nandini Sathyan S
#include <iostream>
использование пространства имен std;
класса Stack {
общественный:
char arr[10];
инт топ=-1;
int push(char);
чар поп();
};
класс Evaluate_infix{
char infix[20];
char постфикс[20];
Операторы стек ;
Стековый операнд;
общественный:
пустота printPostfix();
пустота readInfix();
пустота Infix_Postfix();
пустота postfix_eval();
int precedence (char);
};
пустота Evaluate_infix::readInfix()
{
cout<<"\nEnter инфиксное выражение : ";
cin>>инфикс;
}
пустота Evaluate_infix::Infix_Postfix()
{
int i=0,k=0;
while(инфикс[i]!='\0')
{
если((тип int)инфиксной[я]&ГТ;=49 &усилитель;& (инт)инфиксной[я] И Л;=57)
{
постфикс[k]=инфикс[i];
я++;
к++;
}
остальное, если(инфиксной[я]=='(' || инфиксной[я]=='{' || инфиксной[я]=='[')
{
операторов.толчок(инфиксной[я]);
я++;
}
остальное, если(инфиксной[я]==')' || инфиксной[я]=='}' || инфиксной[я]==']')
{
если(инфикс[i]==')')
{
время(операторы.модуль arr[операторов.топ]!='(')
{
постфикс[k]=операторы.pop();
к++;
}
операторов.поп();
я++;
}
если(инфикс[i]==']')
{
время(операторы.модуль arr[операторов.топ]!='[')
{
постфикс[k]=операторы.pop();
к++;
}
операторов.поп();
я++;
}
если(инфикс[i]=='}')
{
время(операторы.модуль arr[операторов.топ]!='{')
{
постфикс[k]=операторы.pop();
к++;
}
операторов.поп();
я++;
}
}
еще
{
если(операторы.топ==-1)
{
операторов.толчок(инфиксной[я]);
я++;
}
остальное, если( приоритет(инфиксной[я]) &ЛТ;= приоритет(операторы.модуль arr[операторов.топ])) {
постфикс[k]=операторы.pop();
к++;
а(приоритет(операторы.модуль arr[операторов.топ]) == приоритет(инфиксной[я])){
постфикс[k]=операторы.pop();
if(operators.top < 0) {
перерыв;
}
}
операторов.толчок(инфиксной[я]);
я++;
}
остальное, если(приоритет(инфиксной[я]) &ГТ; приоритет(операторы.модуль arr[операторов.топ])) {
операторов.толчок(инфиксной[я]);
я++;
}
}
}
время(операторы.топ!=-1)
{
постфикс[k]=операторы.pop();
к++;
}
}
инт Evaluate_infix::приоритет ( чар ч )
{
если(ch == '^')
{
возвращение(3);
}
если(ch == '+' || ch =='-')
{
возвращение(2);
}
if(ch == '*' || ch =='/')
{
возврат(1);
}
если(ch == '(')
{
возврат(0);
}
возвращает 0;
}
int Stack::push(char item)
{
если(сверху==19)
{
cout<<"переполнение";
возврат -1;
}
еще{
топ=топ+1;
arr[top]=товар;
возвращает 0;
}
}
char Stack::pop()
{
if(top==-1)
{
cout<<"Underflow";
возврат-1 ;
}
еще{
int item=arr[top];
top=top-1;
возврат товара;
}
}
пустота Evaluate_infix::printPostfix()
{
соиь<&ЛТ;"преобразованный постфиксной строки : "&ЛТ;&ЛТ;постфикс;
}
пустота="" evaluate_infix::postfix_eval()
{
="" int="" i="0;
"char=" " a,b,res;
="" while(постфикс[i]!="\0" )
="" {=""
="" если((тип int)постфикс[я]=""&ГТ;=49 &усилитель;& (инт)постфикс[я] И Л;=57)
{
операнд.push(постфикс[i]);
я++;
}
else if( постфикс[i]=='+')
{
а=операнд.поп();;
а=а-48;
Patrice T
Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.
Dave Kreskowiak
Если вы думаете, что кто-то будет отлаживать код для вас и делать вашу работу за вас, вы сильно ошибаетесь. Это ничему тебя не научит.
Отладчики существуют для того, чтобы отлаживать вас, а не код. Они существуют как инструмент для изменения вашего понимания того, что делает код. Вы думаете и предполагаете, что код должен работать "таким образом", когда на самом деле он делает что-то отличное от этого. Вы должны использовать отладчик, чтобы изменить свое понимание. Как только вы это сделаете, вы можете изменить код.