В настоящее время я делаю калькулятор, вводящий математическое выражение, и использую RPn для его вычисления. Поэтому я использую функцию преобразования инфикса в постфикс для его преобразования. Калькулятор работает, помещая число в стек и определяя оператора. Но в моем калькуляторе есть недостаток, он не может обрабатывать отрицательные числа, такие как 1/-1. Я неправильно понял RPn или проблема с функцией инфикса в постфикс?
Обнаружение чисел и операторов
int isOperator(char e){
if(e == '+' || e == '-' || e == '*' || e == '/' || e == '^')
return 1;
else
return 0;
}
int isNumber(char c) {
if ((c>='0' && c<='9') || c=='.') {
return 1;
}
return 0;
}
Преобразование математического выражения в постфикс
void pushPostfix(struct postfixStack* s,int item){
if(s->top == (100-1)){
printf("\nSTACK FULL");
}
else{
++s->top;
s->data[s->top]=item;
}
}
char popPostfix(struct postfixStack* s){
char a=(char)-1;
if(!isEmpty(s)){
a= s->data[s->top];
--s->top;
}
return a;
}
void infixToPostfix(char* infix, char * postfix) {
char *i, *p;
struct postfixStack stack;
char n1;
emptyStack(&stack);
i = &infix[0];
p = &postfix[0];
while (*i) {
while (*i == ' ' || *i == '\t') {
i++;
}
if (isNumber(*i)) {
while (isNumber(*i)) {
*p = *i;
p++;
i++;
}
*p = ' ';
p++;
}
if (*i == '(') {
pushPostfix(&stack, *i);
i++;
}
if (*i == ')') {
n1 = popPostfix(&stack);
while (n1 != '(') {
*p = n1;
p++;
*p = ' ';
p++;
n1 = popPostfix(&stack);
}
i++;
}
if (isOperator(*i)) {
if (isEmpty(&stack)) {
pushPostfix(&stack, *i);
}
else {
n1 = popPostfix(&stack);
while (priority(n1) >= priority(*i)) {
*p = n1;
p++;
*p = ' ';
p++;
n1 = popPostfix(&stack);
}
pushPostfix(&stack, n1);
pushPostfix(&stack, *i);
}
i++;
}
}
while (!isEmpty(&stack)) {
n1 = popPostfix(&stack);
*p = n1;
p++;
*p = ' ';
p++;
}
*p = '\0';
}
#
. - person user3386109   schedule 24.05.2018infixToPostfix
, чтобы сделать его более понятным. - person Quang Huy   schedule 24.05.2018(c>='-9' && c <='-1')
кisNumber
, результат деления 1/-1 равен -1, но 10/-10 также равен -10. Поскольку я оцениваю оператор, используя такое условиеif (t[0] == '+') { c = a + b; }
. Как я могу добавить условие#
, как вы предлагаете? - person Quang Huy   schedule 24.05.2018-
в начале выражения или сразу после другого оператора, измените символ на#
. Получите следующее число и поместите его в стек RPn, затем поместите#
. Когда код считывает#
из выражения RPn, он должен извлечь число, инвертировать его и поместить обратно в стек. - person user3386109   schedule 24.05.2018-
следует цифра, это отрицание, иначе вычитание. - person chux - Reinstate Monica   schedule 24.05.2018