Инфикс для постфикса C программы - PullRequest
0 голосов
/ 25 января 2019

Я создавал программу для преобразования ввода инфикса в постфикс с помощью стека.
Программа, которую я сделал, выглядит следующим образом

Это работает как бесконечный цикл без печати чего-либо значимого. Я пытался найти ошибку, но не увенчался успехом, компилятор также не выдавал никаких предупреждений.

#include<stdio.h>

char po[20];
int top = -1;

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

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

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

main() {
  char st[20], x;
  int a, c = 0, op;
  printf("Enter the expression ");
  scanf("%s", st);
  while (st[c] != '\0') {
    if (st[c] >= 'a' && st[c] <= 'z')
      printf("%c", st[c]);
    else if (st[c] == '(')
      push(st[c]);
    else if (st[c] == ')')
      ;
    {
      while ((x = pop()) != '(')
        printf("%c", pop());
    }
    if (st[c] == '*' || st[c] == '/' || st[c] == '+' || st[c] == '-'
        || st[c] == '^') {
      while (priority(po[top]) >= priority(st[c]))
        printf("%c", pop());
      push(st[c]);
    }
    c = c + 1
  }
  while (top != -1) {
    printf("%c", pop());
  }
}

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Вот версия кода, которая по крайней мере не дает бесконечный цикл.

Изменения в примечании:

  1. Всегда используйте { } с вашими if блоками и блоками циклов.
  2. В этом фрагменте кода, в дополнение к ненужному ;, на который указывали другие, вы дважды щелкали! что не то, что вы хотите. Если вы вставите в printf(), этот цикл while никогда не прекратится, поскольку он никогда не увидит (.

    else if(st[c]==')') {
            while((x=pop()) != '(') {
               printf("%c",pop());
            }
        }
    

    Вот как выглядит фиксированный код:

    else if(st[c]==')') {
            while((x=pop()) != '(') {
               printf("%c",x);
            }
        }
    

Наконец, всегда есть значение по умолчанию return от вашей функции.

  • В вашем коде могут быть и другие логические ошибки. Это просто не дает бесконечный цикл.

Код:

#include<stdio.h>

char po[20];
int top = -1;

void push(char x)
{
    po[++top] = x;
}
char pop()
{
    if(top==-1)
        return -1;
    else
        return po[top--];
}

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

int main()
{
    char st[20],x;
    int a,c=0,op;
    printf("Enter the expression ");
    scanf("%s",st);
    while(st[c]!='\0')
    {
        if(st[c]>='a'&& st[c]<='z') {
            printf("%c",st[c]);
        }
        else if(st[c]=='(') {
            push(st[c]);
        }
        else if(st[c]==')') {
            while((x=pop()) != '(') {

                printf("%c",x);
            }
        }


        if(st[c]=='*' || st[c]=='/' || st[c]=='+' || st[c]=='-' || st[c]=='^')
        {
            while(priority(po[top])>priority(st[c])) {

                printf("%c",pop());
            }
            push(st[c]);
        }


        c=c+1;
    }
    while(top!=-1)
    {


        printf("%c",pop());
    }
}

Выход:

Вот как выглядит вывод:

junglefox @ убунт: ~ / test_programs / $

. / Test Введите выражение (2 + 3) * 4/5 * 2 * 3-4 / (5 + 4)

+ ** / * + / - junglefox @ убунт: ~ / test_programs / $

0 голосов
/ 25 января 2019

Компилятор также не выдал никаких предупреждений.

Экономьте время. Включите все предупреждения или получите лучший компилятор.

warning: control reaches end of non-void function [-Wreturn-type]

Просмотрите приведенную ниже функцию и убедитесь, что она не возвращает значение для всех возможных x.

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

  // Missing return
}

warning: suggest braces around empty body in an 'if' statement [-Wempty-body]

Код ниже является подозрительным. Вы действительно хотите ; после else if (st[c] == ')')?

else if (st[c] == ')')
  ;

error: expected ';' before '}' token

Конечно, опечатка (отсутствует;)

// c = c + 1
c = c + 1;

Могут существовать и другие проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...