簡體   English   中英

如何將中綴表達式轉換為后綴表達式?

[英]How do I convert an infix expression to a postfix expression?

我試圖編寫一個C程序將中綴表達式轉換為后綴並使用輸入的值進行計算。 當我輸入(2 + 14)* 5時,我得到(2 14)5 * +,但它應該是2 14 + 5 *。 所以我的問題是:

  1. 我哪里做錯了?
  2. 如何更改代碼以刪除最后一種形式的括號(后綴)?

謝謝你的幫助。

#include<stdio.h>
#include<string.h>
#include<math.h>

#define oper(x) (x=='+' || x=='-' || x=='*' || x=='/')

char in[30], post[30], stack[30];
int top=-1;

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

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

int precedence(char c)
{
    if (c=='+' || c=='-')
        return 1;
    if (c=='*' || c=='/')
        return 2;
    if (c=='(')
        return 3;
}

main()
{
    char c;
    int l,i,j=0,st1[20],k,h,f,eval,s,N;
    printf("Enter the infix expression : ");
    scanf("%s",&in);
    l=strlen(in);
    for(i=0;i<=l;i++)
    {
        if(oper(in[i]))
        {
            post[j++]=' ';
            while(precedence(in[i])<precedence(stack[top]))
            {
                post[j++]=stack[top];
                pop();
                post[j++]=' ';

            }
            push(in[i]);
        }
        else if(in[i]=='\0')
        {
            while(top!=-1)
            {
                post[j++]=' ';
                post[j++]=stack[top];
                pop();
            }
        }
        else
            post[j++]=in[i];
    }
    post[j]='\0';
    printf("Postfix Expression : %s\n",post);
    i=0;top=-1;f=0;k=0;
    while(i<j)
    {
        if(oper(post[i]))
        {
            f=1;
            c=post[i];
            eval=0;
            switch(c)
            {
                case '+':
                    eval=st1[top-1]+st1[top];
                    break; 
                case '-':
                    eval=st1[top-1]-st1[top];
                    break;
                case '*':
                    eval=st1[top-1]*st1[top];
                    break;
                case '/':
                    eval=st1[top-1]/st1[top];
                    break;
            }
            top--;
            st1[top]=eval; 
        }
        else if(post[i]==' ')
        {
            if(f==0)
            {
                h=i-k;
                s=0;
                while(post[h]!=' ')
                {
                    N=(int)post[h];
                    N=N-48;
                    s=s+N*(pow(10,(k-1)));
                    k--;
                    h++;
                }
                st1[++top]=s;
            }
            k=0;
        }
        else 
        {
            k++;
            f=0;
        }
        i++; 
    }
    printf("Value : %d\n",st1[top]);
}

我沒有對您的代碼進行過多的研究,但是您似乎並沒有以任何特殊的方式來處理輸入中的括號。 它們具有WRT操作順序的非常具體的含義。

我的猜測是您的程序將parens當作數字對待,並且將輸入解析為(分別用L和R代替左paren和右paren)L2 +(14R * 5),在這種情況下輸出是正確的。

在函數precedence ,您應該嘗試

if((c=='(') || (c==')')) {
  return 3;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM