将中缀转换为后缀时出现分段错误

时间:2018-09-12 17:59:09

标签: c data-structures

我正在将中缀转换为后缀,这是我的代码,任何人都可以找出我为什么遇到分段错误吗? 为什么我遇到细分错误?请解释。我尝试了多次,但我还是得到了同样的东西。请帮忙。

是因为我占用了过多的内存还是什么?还是我的程序花费太多时间执行?

    #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 :(得分:0)

免责声明:我没有仔细看过您的代码,只是粗略地浏览了一下。

您的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)来调试此代码。

答案 1 :(得分:0)

主要-> 您在比较stack[top]值时忘记将precedence作为参数传递给precedence

仅当堆栈中存在某些元素时才调用pop()函数-最好使top代表否。堆栈中当前存在的元素数量(使用 0 而不是 -1 初始化。

IMP-> 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;

}