SDUT-284演算式の変換

9916 ワード

Time Limit:1000 ms Memory Limit:65536 KiB Submit Sttistic Discription小明はデータ構造を勉強した後、以前解決していなかった算術式が拡張式に転化した問題を思い出しました.今日彼は解決したいです.データ構造の基礎があるので、明さんはすぐにこの問題を解きましたが、演算式のプレフィックス式と中綴り式はどうやって求められますか?明さんは困惑しています.賢い人は彼の解決を助けてください.Inputは演算式を入力して、\'›\'の文字を終了フラグとします.(データはスペースなし、入力のセットのみを保証します.)Outputは、この式の変換によって得られたプレフィックス式の中缀り式のサフィックスを出力します.3行に分けて出力します.順番はプレフィックス式の中缀り式のサフィックス式です.Sample Input a*b+(c-d/e)*f菗Sample Output+ab-c/def a*b+c-d/e*f ab*cde/-f*+Hit
ソurce
中綴り式をプレフィックス式ステップに変換します.
一.右から左へ遍歴して、アルファベットがマーク配列に保存されます.二.オペレータに遭遇した場合:1.スタックが空またはスタックのトップ要素が')'または''である場合、まだ''が見つからない.(’は、直接的にスタックを圧します.2.スタックの一番上の要素が普通のオペレータである場合、優先度を比較します.もし、スタックのオペレータがスタックの一番上のオペレータより優先度が高いか等しい場合、直接的にスタックを圧します.さもなければ、スタックの一番上の要素をマーク配列に入れてから、スタックの一番上の要素との優先度を比較します.3.もし'('は、スタックの一番上の演算子を順番にイジェクトしてマーク配列に入れます.出会うまでの間に')'このペアの括弧を破棄します.4.最後にスタックの残りの演算子を順番に数字配列の中にイジェクトします.5.符号配列を逆順に出力します.
サフィックス表現をサフィックス式ステップに変換します.
一.左から右へ遍歴して、アルファベットが直接出力されます.二.操作子に遭遇した場合:1.スタックが空またはスタックのトップ要素が'('または')である場合、直接スタックを圧着します.2.スタックの一番上の要素が普通の操作子である場合、優先度が高く、スタックの操作子がスタックの一番上の操作子より優先度が高い場合、直接的にスタックを圧します.(すなわち、スタックのオペレータは、スタックの一番上のオペレータより優先度が低いか、または同じレベルである)スタックの一番上の要素をスタックから取り出し、次にスタックの一番上の要素と優先度を比較します.3.もし出会うならば、順番にスタックの一番上の演算子をイジェクトします.
中綴りに変換して直接括弧に行って出力すればいいです.
コード:
#include 
#include 
#include 

char q[10005];
int i,top,len;
void f1(char *a); //      
void f2(char *a); //      
void f3(char *a); //      
int main()
{
    char a[10005];
    scanf("%s",a);
    len=strlen(a);
    f1(a);
    f2(a);
    f3(a);
    return 0;
}
void f1(char *a)
{
    int s;
    char b[10005]; //    
    top=0;
    s=0;
    for(i=len-2;i>=0;i--)
    {
        if(a[i]>='a'&&a[i]<='z')
        {
            s++;
            b[s]=a[i];
        }
        else if(top==0||a[i]==')'||q[top-1]==')')
            q[top++]=a[i];
        else if(a[i]=='+'||a[i]=='-')
        {
            while(1)
            {
                if(top==0||q[top-1]==')'||q[top-1]=='+'||q[top-1]=='-')
                {
                    q[top++]=a[i];
                    break;
                }
                s++;
                b[s]=q[--top];
            }
        }
        else if(a[i]=='*'||a[i]=='/')
        {
            q[top++]=a[i];
        }
        if(a[i]=='(')
        {
            while(q[top-1]!=')')
            {
                s++;
                b[s]=q[--top];
            }
            top--;
        }
    }
    while(top!=0)
    {
        s++;
        b[s]=q[--top];
    }
    for(i=s;i>=1;i--)
        printf("%c",b[i]);
    printf("
"
); } void f2(char *a) { for(i=0;i<=len-2;i++) { if(a[i]=='('||a[i]==')') continue; printf("%c",a[i]); } printf("
"
); } void f3(char *a) { for(i=0;i<=len-2;i++) { if(a[i]>='a'&&a[i]<='z') printf("%c",a[i]); else if(top==0||a[i]=='('||q[top-1]=='(') q[top++]=a[i]; else if(a[i]=='+'||a[i]=='-') { while(1) { if(q[top-1]=='('||top==0) { q[top++]=a[i]; break; } printf("%c",q[--top]); } } else if(a[i]=='*'||a[i]=='/') { while(1) { if(q[top-1]=='('||top==0||q[top-1]=='+'||q[top-1]=='-') { q[top++]=a[i]; break; } printf("%c",q[--top]); } } else if(a[i]==')') { while(q[top-1]!='(') { printf("%c",q[--top]); } top--; } } while(top!=0) { printf("%c",q[--top]); } printf("
"
); }