中缀到后缀计算器没有给出所需的结果

时间:2014-10-25 20:06:06

标签: c

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<conio.h>
#define BLANK ' '
#define TAB '\t'
#define MAX 50
#define is_number(chr) ((chr>='0')&&(chr<='9'))
void push(long int symbol);
long int pop();
void infix_to_postfix();
int priority(char symbol);
int isEmpty();
int white_space(char);
long int eval_post();
char infix[MAX], postfix[MAX];
long int stack[MAX];
int top;
char operator_set[]="+-*/^()%";
int i=0;
int main()
{
    top=-1;
    printf("Enter infix Exp. : ");
    gets(infix);
    //checking for invalid infix arithmatic expression
    while(infix[i]!='\0')
    {
        if(!white_space(infix[i]) && !strchr(operator_set,infix[i]) && !is_number(infix[i]))
        {
            printf("\nInvalid arithmatic expression");
            return -1;
        }
        i++;
    }

    infix_to_postfix();
    printf("\n==>Postfix Exp.: %s\n",postfix);
    printf("\nThe postfix Exp. Evaluated to %d",eval_post());
    getch();
    return 0;
}

void infix_to_postfix()
{
    unsigned int i,p=0;
    char next;
    char symbol;
    for(i=0;i<strlen(infix);i++)
    {
        symbol=infix[i];
        if(!white_space(symbol))
        {
            switch(symbol)
            {
            case '(':
                push(symbol);
                break;
            case ')':
                while((next=pop())!='(')
                    postfix[p++] = next;
                break;
            case '+':
            case '-':
            case '*':
            case '/':
            case '%':
            case '^':
                while( !isEmpty( ) &&  priority(stack[top])>= priority(symbol) )
                    postfix[p++]=pop();
                push(symbol);
                break;
            default: /*if an operand comes*/
                 postfix[p++]=symbol;
            }
        }
    }
    while(!isEmpty( ))
        postfix[p++]=pop();
    postfix[p]='\0'; /*End postfix with'\0' to make it a string*/
}

/*This function returns the priority of the operator*/
int priority(char symbol)
{
    switch(symbol)
    {
    case '(':
        return 0;
    case '+':
    case '-':
        return 1;
    case '*':
    case '/':
    case '%':
        return 2;
    case '^':
        return 3;
    default :
        return 0;
    }
}

void push(long int symbol)
{
    if(top>MAX)
    {
        printf("Stack overflow\n");
        exit(1);
    }
    stack[++top]=symbol;
}

long int pop()
{
    if( isEmpty() )
    {
        printf("Stack underflow\n");
        exit(1);
    }
    return (stack[top--]);
}
int isEmpty()
{
    if(top==-1)
        return 1;
    else
        return 0;
}

int white_space(char symbol)
{
    if( symbol == BLANK || symbol == TAB )
        return 1;
    else
        return 0;
}

long int eval_post()
{
    long int a,b,temp,result;
    unsigned int i;

    for(i=0;i<strlen(postfix);i++)
    {
        if(postfix[i]<='9' && postfix[i]>='0')
            push(postfix[i]-'0');
        else
        {
            a=pop();
            b=pop();
            switch(postfix[i])
            {
            case '+':
                temp=b+a; break;
            case '-':
                temp=b-a;break;
            case '*':
                temp=b*a;break;
            case '/':
                temp=b/a;break;
            case '%':
                temp=b%a;break;
            case '^':
                temp=pow(b,a);
            }
            push(temp);
        }
    }
    result=pop();
    return result;
}

这是我的代码,当我输入简单的表达式,如1+2+3时,它正在输出正确的输出,但当我输入234+234时,它没有给出所需的结果我不知道我去了哪里错?

任何专家可以帮助我,我花了几个小时但却无法弄明白?

1 个答案:

答案 0 :(得分:1)

代码失败,因为您只考虑代码中的一位数字的情况。例如,12+34被翻译为1234+,后缀解释器将其翻译为1 2 3 4+,从而生成结果7,即3 + 4。您可能想要更改你的代码所以它在后缀代码中的连续数字之间放置空格,并更新后缀解释器以识别多位数字。

也就是说,您的代码中还有其他三个问题。编译并打开警告,编译器会告诉你这样的事情:

  • 您使用无法以安全方式使用的gets功能。使用gets的每个程序都是错误的。

  • 使用不可移植的conio.h标头,导致您的代码仅在DOS上运行,在某种程度上在Microsoft Windows上运行。请考虑不使用conio.h

  • 在您的printf次调用中,为%d类型的参数指定格式long int。这是未定义的行为,请使用%ld