中綴表示式轉換為字尾表示式的演算法

2021-07-11 07:13:37 字數 1532 閱讀 9766

中綴表示式與字尾表示式

(1) 中綴表示式

表達形式是運算子在兩個操作符之間(例如:4+5),它適合人的閱讀和計算習慣對機器相對複雜

(2) 字尾表示式

表達形式是運算子在兩個操作符之後(例如:4 5 +),它適合計算機的計算

中綴表示式轉換為字尾表示式的演算法

(1)從左向右逐個遍歷中綴表示式;

(2)若字元是數字,則存入字尾表示式;

(3)若字元是』(『,則存入棧;

(4)若字元是』)』,則從棧頂依次逐個讀取並刪除棧頂元素後,將棧頂元素存入字尾表示式,直到值是』(『,從棧中除』(『;

(5)若字元是』』或』/』

如果棧頂元素優先順序比』(『高,就直接入棧;

否則從棧頂依次逐個讀取並刪除棧頂元素後,將棧頂元素存入字尾表示式,直至遇到優先順序比它低或值為』(『,字元 入棧;

(6)若字元是』+』或』-『

如果棧頂元素優先順序比』(『高,就直接入棧;

否則從棧頂依次逐個讀取並刪除棧頂元素後,將棧頂元素存入字尾表示式,直至值為』(『,字元入棧;

舉例( 4(5+6)-7+8 )

4 |

4 |

4 | (

4 5 | * (

4 5 | * ( +

4 5 6 | * ( +

4 5 6 + |

4 5 6 + | -

4 5 6 + * 7 | -

4 5 6 + * 7 - | +

4 5 6 + * 7 - 8 | +

4 5 6 + * 7 - 8 + |

(用』|』隔開字尾表示式和棧)

**

/*

中綴表示式的格式:每個數字後面加'.'(舉例:4.+5.*(6.+7.))

*/void expmidtoexpbak(char * expmiddle,char * expback)

while('.' != expmiddle[i]);

expback[j] = '.';

j++;

}else

if('(' == expmiddle[i])

else

if(')' == expmiddle[i])

}else

if('*' == expmiddle[i] || '/' == expmiddle[i])

else

}

}pushstack(&s1,expmiddle[i]);

}else

if('+' == expmiddle[i] || '-' == expmiddle[i])

else

}

}pushstack(&s1,expmiddle[i]);

}i++;

}while(!emptystack(&s1))

expback[j]='\0';//必須加入字串的結束符是'\0'

return;

}

中綴表示式轉換為字尾表示式

今天我們課前談一談,要說點什麼好呢?最近小甲魚發現,很多魚油在學習資料結構和演算法的時候積極性已經開始有點下降了。甚至很多朋友懷疑資料結構和演算法到底有沒有用?實話說,在大廈的防震設計 消除疾病 防止水源枯竭這些實際問題中,很遺憾,資料結構和演算法幾乎起不到任何直接作用。那為什麼我們要學呢?很簡單,...

中綴表示式轉換為字尾表示式

字尾表示式也叫逆波蘭表示式,其求值過程可以用到棧來輔助儲存。假定待求值的字尾表示式為 6 5 2 3 8 3 則其求值過程如下 1 遍歷表示式,遇到的數字首先放入棧中,此時棧如下所示 2 接著讀到 則彈出3和2,執行3 2,計算結果等於5,並將5壓入到棧中。3 讀到8,將其直接放入棧中。4 讀到 彈...

中綴表示式轉換為字尾表示式

字尾表示式也叫逆波蘭表示式,其求值過程可以用到棧來輔助儲存。假定待求值的字尾表示式為 6 5 2 3 8 3 則其求值過程如下 1 遍歷表示式,遇到的數字首先放入棧中,此時棧如下所示 2 接著讀到 則彈出3和2,執行3 2,計算結果等於5,並將5壓入到棧中。3 讀到8,將其直接放入棧中。4 讀到 彈...