2011-09-04 19:08:18Morris

d285. 727 Postfix Expression

d285. 727 Postfix Expression

內容 :

根據下列的規定寫一個程式將中置運算式改成後置運算式。
1. 輸入的中置運算式每行一個字元,最多50行。例如,(3+2)*5 將以下列形式出現:

    (

    3

    +

    2

    )

    *

    5

1. 本程式僅處理 +, -, *, / 等二元運算子。

2. 運算元為一位數數字。
3. * 和 / 運算子優先順序最高。+ 和 – 運算子則為最低。相同優先順序的運算子則由左至右運算。括號則是用來改變優先順序的群組符號。
4. 每筆測試資料均為合法的運算式。

輸入說明 :

輸入檔第一行會有一個數字表示測試資料的筆數。接下來會有好幾個運算式,每個運算式之前會有一個空行。

輸出說明 :

每個後置運算式輸出成一行。每個運算式之間要有一個空行。

範例輸入 :

2 (3+2)*53+2

範例輸出 :

32+5*32+

提示 :

出處 :

UVA727 (管理:nanj0178)



作法 : stack

其實還蠻怕符號的 ASCII 跟儲存的數字搞混, 因此做了下標記

數字直接跳出來, 而符號用一個 Stack 考慮出現的順序

/**********************************************************************************/
/*  Problem: d285 " 727 Postfix Expression " from UVA727                          */
/*  Language: C                                                                   */
/*  Result: AC (0ms, 246KB) on ZeroJudge                                          */
/*  Author: morris1028 at 2011-09-04 15:40:08                                     */
/**********************************************************************************/


#include<stdio.h>
int Priority(char c) {
    switch(c) {
        case '(':return 1;
        case ')':return 2;
        case '+':return 3;
        case '-':return 3;
        case '*':return 4;
        case '/':return 4;
        case '%':return 4;
    }
}
int change(char *A) {
    int i, j;
    int Ans[1000], Sign[1000], AIdx = -1, tmp, g;
    int Stack[1000], SIdx = -1;
    for(i = 0, tmp = 0, g = 0; A[i]; i++) {
        if(A[i] >= '0' && A[i] <= '9')
            tmp = tmp*10 + A[i]-'0', g = 1;
        else {
            if(g)
                Ans[++AIdx] = tmp, Sign[AIdx] = 0, tmp = 0, g = 0;
            Stack[++SIdx] = A[i];
            if(A[i] == ')') {
                SIdx--;
                while(SIdx >= 0 && Stack[SIdx] != '(')
                    Ans[++AIdx] = Stack[SIdx], Sign[AIdx] = 1, SIdx--;
                SIdx--;
            }
            else
                while(SIdx >= 1 && Priority(Stack[SIdx-1]) >= Priority(Stack[SIdx]) && Stack[SIdx] != '(')
                    Ans[++AIdx] = Stack[SIdx-1], Sign[AIdx] = 1, Stack[SIdx-1] = Stack[SIdx], SIdx--;
        }
    }
    if(g)
        Ans[++AIdx] = tmp, Sign[AIdx] = 0, tmp = 0, g = 0;
    while(SIdx >= 0)
        Ans[++AIdx] = Stack[SIdx], Sign[AIdx] = 1, SIdx--;
    for(i = 0; i <= AIdx; i++)
        if(Sign[i] == 1)
            printf("%c", Ans[i]);
        else
            printf("%d", Ans[i]);
    puts("");
}
main() {
    int t, C = 0;
    char s[1000], *A = s, tmp[3];
    scanf("%d", &t), getchar(), gets(tmp);
    while(t--) {
        A = s;
        while(gets(tmp)) {
            if(tmp[0] == '\0')    break;
            *A++ = tmp[0];
        }
        *A++ = '\0';
        change(s);
        if(t) puts("");

    }
    return 0;
}