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

标签 c data-structures

我正在将 infix 转换为 postfix,这是我的代码,任何人都可以弄清楚为什么我会遇到段错误吗? 为什么我会出现段错误?请解释。我尝试了多次,但仍然得到同样的结果。请帮忙。

是因为我占用了多余的内存还是什么?或者我的程序执行时间太长?

    #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);
}

最佳答案

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

您的 pop() 函数格式不正确。

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

1) 我很确定这甚至不会编译(或者至少你的 C 编译器会抛出一些错误),因为如果 top == -1,那么这个函数甚至不会返回任何内容。 2) 函数在更新“top”之前返回。这意味着顶部递减实际上从未发生,因此堆栈不断地由“顶部”索引。

这可能不是导致段错误的直接原因,但它是一个很好的起点。作为@Ripi2精神的一般建议,我建议您使用调试器(即GDB)、printf语句或内存分析器(例如valgrind)来调试此代码。

关于c - 将中缀转换为后缀时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52301014/

相关文章:

c - UNIX C BSD 套接字 TCP_KEEPALIVE 如何检查套接字是否被标记为损坏

c - 减少静态库大小的编译器选项和其他机制是什么?

c - "Parse"代码行不允许代码执行

c - 内核崩溃后获取 Linux 内核调试信息

java - 根据给定值和父 ID 创建树

c++ - C++ unordered_map 的 rehash() 和 reserve() 方法有什么区别?

c - 错误 LNK2019 : unresolved external symbol (Matlab)

c++ - 用于存储顶点属性的数据结构

r - R 中的堆栈类 - 更简洁的东西

java - linkedHashSet 中的有序插入,有什么高性能的方法吗?