堆栈中缀到postfix

时间:2017-09-26 20:50:59

标签: c

我的代码运行得很好! 唯一的问题是,无论何时我使用括号中缀输入,它都会出现一个' J'在后缀表达结束!!有什么建议?? 这里的算法是所有表达式都被转换的基本算法,所有这些都是正确的,但尾随的是J'我只是不明白!!建议??

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

#define MAX 50

char stack[MAX];

int top = -1;

void push(char element)
{
    stack[++top] = element;
}

char pop()
{
    return(stack[top--]);
}

char tope()
{
    return(stack[top]);
}

int prec(char c)
{
    switch(c){
        case '+':
        case '-' : return 1;
                    break;
        case '*' :
        case '/' : return 2;
                   break;
        default:
                   return 0;
                   break;
        }
}

int main()
{

    char post[MAX],in[MAX],ch,element;
    printf("Infix expression : ");
    scanf("%s",in);

    int i=0,k=0;

    in[strlen(in)] = ')';
    push('(');

    while((ch = in[i++]) != '\0')
    {
        if(isalnum(ch))
            post[k++] = ch;
        if(ch == '(') 
            push(ch);
        if(ch == ')')
        {
            while(tope() != '(')
            {
                post[k++] = pop();
            }
            pop();
        }
        if(ch == '+' || ch =='-' || ch == '*' || ch == '/')
        {
            while(prec(ch) <= prec(tope()))
            {
                post[k++] = pop();
            }
            push(ch);
        }
    }
    post[k] = '\0';

    printf("%s",post);

    return 0;




}

1 个答案:

答案 0 :(得分:2)

in[strlen(in)] = ')';

覆盖了nul-terminating字符,它解释了打印时出现的奇怪字符(打印只有在运气时遇到另一个nul字符时停止:未定义的行为,如果在in中找不到空字符,甚至可能导致崩溃50字节缓冲区)

你必须改变它,例如:

int l = strlen(in);
in[l] = ')';
in[l+1] = '\0';

注意: 要将字符串的长度存储在l中,而不是两次调用strlen(in),这不仅是因为性能损失,而是因为括号表示在{null-terminate>之前strlen无法正常工作。

(您也可能希望像scanf这样保护scanf("%48s",in);,这样您就可以确保有足够的空间容纳50个大小的缓冲区的额外括号,甚至可以与您的宏定义兼容,见scanf: template with macro (#define constant) inside