Ошибка сегментации при преобразовании инфикса в постфикс - PullRequest
0 голосов
/ 12 сентября 2018

Я конвертирую инфикс в постфикс, вот мой код, может кто-нибудь выяснить, почему я получаю ошибку сегментации? Почему я получаю ошибку сегментации? Пожалуйста, объясни. Я пробовал это несколько раз, но получаю одно и то же. Пожалуйста, помогите.

Это потому что я забрал лишнюю память или как? или моя программа занимает слишком много времени для выполнения?

    #include<stdio.h>
#include<ctype.h>
#include<string.h>
#define MAX 100
char infix[MAX],postfix[MAX];
int top = -1;
char stack[MAX];

void push(char element){
    if(top == MAX-1)
        {
        printf("Error: Stack Overflow\n");
        }
    else
        {
            top = top +1;
            stack[top] = element;
        }
}

char pop(){
    if (top == -1)
        printf("Error: Stack Underflow\n");
    else
        {
            return stack[top];
            top = top -1;
        }
}

int precedence(char symbol){

    switch(symbol){

        case '+':
        case '-':
            return 2;
            break;
        case '*':
        case '/':
        case '%':
            return 3;
            break;
        case '(':
        case ')':
        case '#':
            return 1;
            break;
        default: 
            return 0;
            break;
    }
}

void infixtopostfix(char infix[],char postfix[]){

    int i=0,j=0;
    char symbol;
    stack[++top] = '#';

    for (i=0;i<strlen(infix);i++){

        symbol = infix[i];

        if(isalnum(symbol)){
            postfix[j] = symbol;
            j++; 
        }
        else if (symbol == '('){
            push(symbol);
        }
        else if (symbol == ')'){

            while(stack[top] != '('){
                postfix[j] = pop();
                j++;
            }
            pop();     //This will pop out ( from the stack.
        }
        else{
            if (precedence(symbol)>stack[top]){
                push(symbol);
            }
            else{
                while(precedence(symbol)<=stack[top]){
                    postfix[j] = pop();
                    j++;
                }
                push(symbol);
            }
        }
    }

    while(stack[top] != '#'){

        postfix[j] = pop();
        j++;
    }
    postfix[j] = '\0';
}

void main(){


    printf("Enter an infix expression:\t");
    scanf("%s",infix);

    infixtopostfix(infix,postfix);
    printf("The infix expression is:  %s",infix);
    printf("The postfix expression is: %s",postfix);
}

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

MAJOR -> Вы забыли передать stack[top] в качестве аргумента функции precedence при сравнении precedence значений.

вызовите pop() функцию только при наличии некоторогоэлемент присутствует в стеке - лучше сделать top символом no.элементов, присутствующих в настоящее время в стеке (инициализируйте его с помощью 0 вместо -1 .

IMP -> In pop() (или любой другой функции), после выполнения оператора return после этого вы не сможете изменить top=top-1 -> лучше сделать его return stack[--top].


Вот правильный код:

  #include<stdio.h>
  #include<ctype.h>
  #include<string.h>
  #include<stdlib.h>
  #define MAX 100
  char infix[MAX],postfix[MAX];
  int top = 0;
  char stack[MAX];

  void push(char element){
      if(top == MAX-1)
      {
          printf("Error: Stack Overflow\n");
      }
      else
      {
        stack[top++] = element;
      }
 }

 char pop(){
      if (top ==1)
          printf("Error: Stack Underflow\n");
      else
      {  
        return stack[--top];
      }
  }

  int precedence(char symbol){
        printf("pre%d\n\n",symbol);
        if((symbol=='+')||(symbol=='-')
                  return 1;
        if((symbol=='*')||(symbol=='/')||(symbol=='%'))
                 return 2;
        else
                 return 0;
   }

    void infixtopostfix(char infix[],char postfix[]){

         int i=0,j=0;
         char symbol;
         stack[++top] = '#';

         for (i=0;i<strlen(infix);i++){

          symbol = infix[i];
          if(isalnum(symbol)){
               postfix[j] = symbol;
               j++; 
          }
          else if (symbol == '('){
               push(symbol);
          }
          else if (symbol == ')'){
               while(stack[top] != '('){
                    postfix[j] = pop();
                    j++;
           }
               pop();     //This will pop out ( from the stack.
           }
           else{
            while((top>1)&&(precedence(symbol)<=precedence(stack[top-1]))){
                postfix[j] = pop();
                j++;
           }
               push(symbol);
        }
    }

    while(top>1){

        postfix[j] = pop();
        j++;
    }
    postfix[j] = '\0';
 }

int main(){


    printf("Enter an infix expression:\t");
    scanf(" %s",infix);

    infixtopostfix(infix,postfix);
    printf("The infix expression is:  %s",infix);
    printf("The postfix expression is: %s",postfix);
    return 0;

}
0 голосов
/ 12 сентября 2018

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

Ваша функция pop () неправильно сформирована.

    if (top == -1)
    printf("Error: Stack Underflow\n");
else
    {
        return stack[top];
        top = top -1;
    }

1) Я почти уверен, что он даже не скомпилируется (или, по крайней мере, ваш компилятор C выдаст несколько ошибок), потому что если top == -1, то эта функция даже ничего не вернет. 2) Функция возвращает перед обновлением «top». Это означает, что верхний декремент на самом деле никогда не происходит, поэтому стек постоянно индексируется как «top».

Это не может быть прямой причиной вашей ошибки сегмента, но это хорошая отправная точка. В качестве общего предложения в духе @ Ripi2 я предлагаю вам отладить этот код либо с помощью отладчика (например, GDB), операторов printf, либо профилировщика памяти, такого как valgrind.

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