Операторы, не вставляющие в стек в C при попытке преобразовать инфиксное выражение в постфиксное - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь реализовать программу конвертации infix-to-postfix . При выполнении кода я вижу только буквы-цифры c символов. Арифметические c операторы не печатают. После отладки я обнаружил, что операторы не вставляются в стек. Я не мог выяснить причину этого.

Любая помощь приветствуется.

#include<stdio.h>
#include <ctype.h>

#define MAX 50

char st[MAX];
int top = -1;
void push(char);
char pop();
int priority(char);

int main()
{
  int i=0;
  char x,s[50];
  printf("Enter infix expression: ");
  gets(s);
  while(s[i]!='\0')
  {
    if(isalnum(s[i]))
      printf("%c",s[i]);
    else if(s[i] == '(')
      push(s[i]);
    else if(s[i] == ')')
    {
      while((x=pop())!='(')
              printf("%c",x);
    }
    else
    {
      while(priority(st[top])>=priority(s[i]))
        printf("%c",pop());
      push(st[i]);
    }
    i++;
  }
  while(top!=-1)
    printf("%c",pop());
}

void push(char x)
{
  st[++top] = x;
}

char pop()
{
  if(top == -1)
    return -1;
  else
    return (st[top--]);
}

int priority(char x)
{
  if(x == '(')
      return 0;
  if(x == '+' || x == '-')
    return 1;
  if(x == '*' || x == '/' || x == '%')
    return 2;
}

1 Ответ

2 голосов
/ 08 апреля 2020

Как вы правильно обнаружили в сеансе отладки, вы не видите операторов в выражении postfix , потому что вы никогда не push() добавляете их в свой стек.

Фактически

  • в первом if вы проверяете alphanumeri c символов
  • в следующем else if вы проверяете открывающую скобку
  • во втором else if вас проверьте закрывающую скобку
  • в финале, иначе вы управляете pop s из стека ... но вы ничего не набрали sh ! (1)

Нужно исправить последние else, где у вас есть как минимум две различные проблемы:

  1. Вы получаете доступ к st[top] без проверки значения top. Вам нужно управлять случаем, в котором top = -1, это привело бы к выходу за пределы массива стека и к неопределенному поведению. Я думаю, что в этом сценарии вам просто нужно набрать sh оператора
  2. Вы пу sh в стеке st[i]. Возможно, вы имели в виду s[i]

Таким образом, при анализе выражения становится

  while(s[i]!='\0')
  {
    if(isalnum(s[i]))
      printf("%c ",s[i]);
    else if(s[i] == '(' )
      push(s[i]);
    else if(s[i] == ')')
    {
      while((x=pop())!='(')
              printf("%c ",x);
    }
    else
    {
      if( top != -1 )
      {
        while(priority(st[top])>=priority(s[i]))
          printf("%c ",pop());
      }
      push(s[i]);
    }
    i++;
  }

Ввод:

4*6+3

Выход:

4 6 * 3 +

(я добавил дополнительный пробел после каждого %c в printf с, чтобы улучшить читаемость вывода).


Примечание : Вам все еще нужно исправить некоторые проблемы в управлении приоритетами операторов.

...