中序式轉後序式程式錯誤

程式如下

http://rafb.net/p/agZdo848.html

但我檢查不出哪裡錯了

請幫幫我,謝謝

已更新項目:

恩,我後來發現是我自己把"getch"和"getchar"指令搞混了

很感謝兩位網友的回應

關於提姆的回應:其實在這一題中並沒有"括號和括號比較優先權的問題"

因為我的做法是遇到右括號就存入堆疊中,遇到左括號將堆疊中的symbol pop出

直到遇到第一個右括號

但是其實遞迴也是一種堆疊,原理與提姆所說的一樣

特別感謝東邪無弓大哥,因為我寫程式都沒寫例外處理(基礎的教科書上都沒寫)

這樣寫確實可以避免很多程式出錯的情況

感謝二位^^

2 個解答

評分
  • 1 0 年前
    最佳解答

    1.你的程式在輸入的運算式是合乎規定時,應是正常的。

    2.但在括號不對稱時,則不正常運作:

    多了)時,會胡亂讀取記憶體而顯示大亂。

    多了(時,不會大亂,但會多印出(。

    3.我稍為幫你做了修正(不變動你的程式架構),當有上述情況時,會顯示「infix expression ERROR!」,提示你輸入的運算式有誤。

    4.僅摘示涉及修正的程式片段,增修的部份以紅色字體標示。

    5.無暇細酌,故這些修正可能未含蓋所有的潛伏狀況,但應足可作為你增進本程式功能之提示,你應可舉一反三。

    ......

    int infix_to_postfix();

    ......

    int main(){

    (略刪)

    if (infix_to_postfix()) printf("\ninfix expression ERROR!\n"); fflush(stdin); getch();

    return 0;

    }

    int infix_to_postfix(){

    (略刪)

    for(i=0;i<rear;i++){

    switch(infix[i]){

    //pop stack[], until '('

    case ')':

    while(stack[top]!='(' && top>=0)

    printf("%c",stack[top--]);

    if (top<0) return 1; //error

    top--;//pop '('

    break;

    //pop every thing in stack[]

    case '#':

    while(stack[top]!='#' && stack[top]!='(')

    printf("%c",stack[top--]);

    if (top>0) return 1; //error

    break;

    /*

    check if ISP >=ICP

    ->if yes

    ->pop the operator(ex:+,-,*...) in the stack, until ISP<ICP

    ->push the operator

    ->else

    ->push the operator

    */

    case '(':

    case '*':

    case '/':

    case '+':

    case '-':

    while(compare(stack[top],infix[i]))

    printf("%c",stack[top--]);

    stack[++top]=infix[i];//push the operator

    break;

    //oprand(ex:A,B.....)

    default:

    printf("%c",infix[i]);

    break;

    }

    }

    return 0;

    }

    2008-09-26 14:15:27 補充:

    如果把 int infix_to_postfix() 再改成 char * int infix_to_postfix()

    傳回轉換後的字串,(若有錯誤傳回NULL)

    然後再據以印出或進一步的應用,

    個人認為是較理想的。

    請自行試看看!

  • 提姆
    Lv 5
    1 0 年前

    當括號深度不止一層時,每一層括號的優先順序都不一樣,不能直接比大小。

    以前寫這題時用的是遞迴式,當遇到左括號時:

    1、須找到對應的右括號

    2、把括號中的〔子字串〕切出來優先處理

    3、此〔子字串〕被處理完後,才接著處理括號外的部份。

    例如a*(b+c/d) ,處理順序是這樣:

      in_fix   post_fix stack

    1 a*(b+c/d) 

    2 (b+c/d)  a    *  在此時把〔b+c/d〕傳入第二層的infix_to_postfix

    3.1 b+c/d

    3.2 c/d    b   +

    3.3 /d    bc   +

    3.4 d    bc    /+

    3.5      bcd   /+

    3.6      bcd/+    此時第二層的infix_to_postfix把〔bcd/+〕傳回

    4      abcd/+  *

    5      abcd/+*

    找〔對應的右括號〕時,須計算你〔一路上〕碰到幾個括號,碰到左括號則depth(括號深度)+1,碰到右括號則depth-1,當depth變回0時表示你找到右括號了,然後才把括號中間的部份拿出來,當做一句獨立的句子來處理。

    因為無法預知要call幾層,故以遞迴處理。

    如果不願意用遞迴,則你所有的變數均須多一維,即stack、infix、postfix須宣告成二維的,top、i、rear須為一維陣列。

還有問題?馬上發問,尋求解答。