Преобразование из инфикса в постфикс и оценка постфиксной нотации

#c #stack #postfix-notation #infix-notation

#c #стек #постфиксная нотация #инфиксная нотация

Вопрос:

Я пишу программу, которая считывает инфиксную нотацию, преобразует ее в постфиксную и затем оценивает этот постфикс. Вот моя программа:

 #include<stdio.h> 
#include <ctype.h>
#define SIZE 50            /* Size of Stack */

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;
 }
}
pushit(int ele){                       /* Function for PUSH operation */
 s[  top]=ele;
}

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

 main() { /* Main Program */
  char infx[50], pofx[50], ch, elem;
 int i = 0, k = 0, op1, op2,ele;
 printf("nnRead the Infix Expression   ");
 scanf("%s", infx);
 push('#');
 while ((ch = infx[i  ]) != '') {
  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] = ''; /* Make pofx as valid string */
 printf("nnGiven Infix Expn: %s  Postfix Expn: %sn", infx, pofx);

 while( (ch=pofx[i  ]) != '')
 {
  if(isdigit(ch)) pushit(ch-'0'); /* Push the operand */
  else
  {        /* Operator,pop two  operands */
   op2=popit();
   op1=popit();
   switch(ch)
   {
   case ' ':pushit(op1 op2);break;
   case '-':pushit(op1-op2);break;
   case '*':pushit(op1*op2);break;
   case '/':pushit(op1/op2);break;
   }
  }
 }
 printf("n Given Postfix Expn: %sn",pofx);
 printf("n Result after Evaluation: %dn",s[top]);
}
  

Программа правильно преобразует мой инфикс в постфиксную нотацию. Однако для части оценки он всегда возвращает 0 в результате.

Кроме того, при преобразовании из инфикса в постфикс я хотел бы печатать результат на каждом шаге, как я могу это сделать?

Комментарии:

1. Небольшое замечание: Интересное название: pushit . Это делает p.u.

2. Примечание: если ваша запись содержит пробелы, то scanf("%s", infx); не будет сканироваться вся строка.

3. Слишком много кода, слишком мало отладки.

4. @chux хахахахаха… Я обратил на это внимание только тогда, когда вы указали на это. Не беспокойтесь, я изменил имена функций!

Ответ №1:

Одна из проблем заключается в том, что вы сохраняете значения в s виде символа с сохранением 1 байта на элемент, а затем пытаетесь вставить целые числа в s с:

 pushit (int ele) {      /* Function for PUSH operation */
    s[  top] = ele;
}
  

После смешивания int / char в s вы пытаетесь прочитать:

 op2=popit();
op1=popit();
  

которая пытается создать int из popit() . popit() это просто 1 байт char . Таким образом, op1 и op2 не получают желаемых значений:

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

Вам нужно посмотреть, как вы храните целые числа, если вы ожидаете получить целые числа обратно. Наконец, посмотрите на свои предупреждения. Как минимум, сборка с -Wall опцией. Это показывает:

 popit.c:8:1: warning: return type defaults to ‘int’
popit.c:32:1: warning: return type defaults to ‘int’
popit.c:41:1: warning: return type defaults to ‘int 

Возможно, это то, что вы имели в виду. Однако ваш код должен создаваться без предупреждения, чтобы гарантировать, что он делает то, что вы думаете, что он делает.

Комментарии:

1. Да, вы правы!! Большое спасибо за вашу помощь! Наконец-то у меня получилось!

Ответ №2:

В строке нет. 9 Введите:

 char push(char elem)
  

amp; Строка № 32
Тип:

 int pushit(int ele)