Как реализовать математический алгоритм моего постфиксного алгоритма - C

У меня есть простой алгоритм создания постфикса в C.

Вот пример программы с моим дополнением к дескриптору pow:

/***********************************************************
* You can use all the programs on  www.c-program-example.com
* for personal and learning purposes. For permissions to use the
* programs for commercial purposes,
* contact [email protected]
* To find more C programs, do visit www.c-program-example.com
* and browse!
* 
*                                  Happy Coding
***********************************************************/

#define SIZE 50            /* Size of Stack */
#include <ctype.h>
char s[SIZE];
int top = -1; /* Global declarations */

push(char elem) { /* Function for PUSH operation */
 s[++top] = elem;
}

char pop() { /* Function for POP operation */
 return (s[top--]);
}

int pr(char elem) { /* Function for precedence */
 switch (elem) {
 case '#':
  return 0;
 case '(':
  return 1;
 case '+':
 case '-':
  return 2;
 case '*':
 case '/':
  return 3;
 case '^':
  return 4;
 }
}

main() { /* Main Program */
 char infx[50], pofx[50], ch, elem;
 int i = 0, k = 0;
 printf("\n\nRead the Infix Expression ? ");
 scanf("%s", infx);
 push('#');
 while ((ch = infx[i++]) != '\0') {
  if (ch == '(')
   push(ch);
  else if (isalnum(ch))
   pofx[k++] = ch;
  else if (ch == ')') {
   while (s[top] != '(')
    pofx[k++] = pop();
   elem = pop(); /* Remove ( */
  } else { /* Operator */
   while (pr(s[top]) >= pr(ch))
    pofx[k++] = pop();
   push(ch);
  }
 }
 while (s[top] != '#') /* Pop from stack till empty */
  pofx[k++] = pop();
 pofx[k] = '\0'; /* Make pofx as valid string */
 printf("\n\nGiven Infix Expn: %s  Postfix Expn: %s\n", infx, pofx);
}

Я пытаюсь реализовать math pow, но это не работает, вы можете мне помочь? Как я могу реализовать? Например, ввод: (1-5)^2^3, вывод: 15-2^3^, но это неправильно, правильный вывод: 15-23^^

Я думаю, что ошибка в методе int pr(char elem), не могли бы вы мне помочь?


person user3139356    schedule 27.12.2013    source источник
comment
Множество алгоритмов для обратной польской нотации — просто погуглите   -  person Ed Heal    schedule 27.12.2013
comment
Зачем мне скачивать то, чего я не понимаю? Я это поняла. Спасибо за полезный совет.   -  person user3139356    schedule 27.12.2013
comment
Это алгоритм, который вам нужен. В википедии есть хорошее объяснение   -  person Ed Heal    schedule 27.12.2013
comment
Спасибо за ссылку, в вики конечно читал, но реализовать не могу,...   -  person user3139356    schedule 27.12.2013
comment
Вы можете это объяснить? Вот мой код, но вы забыли удалить ссылку на c-program-example.com/2011/10/   -  person Jongware    schedule 27.12.2013
comment
Ссылку не забыл убрать, я не говорил что код это моя ссылка я оставил специально, этот код я нашел в инете и я его прошел и он понял. Вижу о совете исповедуюсь, только предложения нравятся детям.   -  person user3139356    schedule 27.12.2013
comment
Какая? Я ничего в этом не понимаю.   -  person Martin James    schedule 27.12.2013
comment
МАРТИН: Я пытаюсь внедрить код при заболеваниях(pow) из вышеперечисленного, и прошу посетителей форума дать совет.   -  person user3139356    schedule 27.12.2013


Ответы (1)


Проблема не заключается в int pr(char elem), так как это очень простая функция, которая возвращает только значение приоритета для оператора. Это более тонко, чем это:

Числа (а также буквенные символы) сразу же «вставляются» в pofx. Скобки и операторы должны быть временно сохранены в собственном стеке: s. Только в конце строки или при обнаружении оператора более высокого приоритета операторы, находящиеся в настоящее время в собственном стеке, должны быть добавлены в pofx:

./infix "(1-5)+2*3"
pushing number '1'
pushing operator '-' (top is ()
pushing number '5'
resolving parentheses
pushing operator '+' (top is #)
pushing number '2'
pushing operator '*' (top is +)
pushing number '3'
Postfix Expn: 15-23*+

Исходный код проверяет приоритет "выше или равно":

.. /* Operator */
   while (pr(s[top]) >= pr(ch))

Учитывая часть ..^2^3, последовательность нажатия такова

^ - operator, #4 -> push on operand stack
2 - digit -> push immediately
^ - operator, #4 -> operand stack is '^' which is *equal*, so move to output stack
    and push next operand
3 - digit -> push immediately
.. end of input, move operand stack ('^' only) to end of output

Если вы измените сравнение на это, оно будет работать правильно:

while (pr(s[top]) > pr(ch))
person Jongware    schedule 27.12.2013
comment
Пожалуйста! Я надеюсь, что это также объяснило вам общий алгоритм. (Предложение: можете ли вы изменить свой заголовок на что-то другое, кроме болезни? Кажется, закрался неправильный перевод.) - person Jongware; 27.12.2013
comment
(Я отредактировал свой комментарий) - Да, это работает, а что насчет этого примера ввода: 3+4*2/(1-5)^2^3, вывода: 3 4 2 1 5 - 2 3 ^ ^ / * + , но правильный вывод 3 4 2 * 1 5 − 2 3 ^ ^ / + - person user3139356; 27.12.2013
comment
Это потому, что * и / в настоящее время имеют одинаковый приоритет. Если вы измените *, чтобы вернуть более высокий приоритет, чем /, вы получите правильный вывод. - person Jongware; 27.12.2013
comment
Спасибо, я меняю, но всегда получаю один и тот же плохой результат... int pr(char elem) { /* Функция для приоритета / switch (elem) { case '#': return 0; case '(': возврат 1; case '+': case '-': возврат 2; case '/': возврат 3; case '': возврат 4; case '^': возврат 5; } } - person user3139356; 27.12.2013
comment
Ваша новая функция pr верна, но я не могу повторить этот результат. Используя ваш исходный код, мои изменения и новую функцию pr, я получаю правильный результат. - person Jongware; 27.12.2013
comment
Хех, СЕЙЧАС это работает, я не знаю, где была проблема, и теперь все в порядке, чем вы очень много! (это проект в школу, .. функция рисования по математике) :) Чем тебе Jongware, пока :-) - person user3139356; 27.12.2013