中綴表示式與字首 字尾表示式的轉換

2021-08-09 01:35:43 字數 2526 閱讀 4254

中綴表示式:便於人看;

字首表示式:又稱波蘭式,運算子在前邊,運算數在後邊;

字尾表示式:又稱逆波蘭式,運算數在前邊,運算子在後邊;

一、中綴表示式轉換字首表示式: 1、

初始化兩個棧,

s1(存放數字),

s2(存放運算子);

2、表示式右邊開始,遍歷表示式;

3、遇到數字放入

s1中,遇到運算子放入

s2中,放入法則如下:

(1)如果

s2為空,或者「

)」,直接放進去;

(2)當前運算子和棧頂運算子比較,當前運算子優先順序大於等於棧頂運算子

優先順序,直接放進去;

(3)如果當前運算子小於棧頂運算子優先順序,棧頂運算子取出來放入

s1中,

重複(2)

、(3);4、

s1棧中的元素依次出棧,入

s2棧;

5、s2

棧中元素依次出棧重新組成表示式即為字首表示式。

二、中綴表示式轉換字尾表示式 1、

初始化兩個棧,

s1(存放數字),

s2(存放運算子);

2、從表示式左邊開始遍歷,數字放入

s1中,運算子放入

s2中; 3、

運算子放入

s2中的規則:

(1)如果s2

空或者棧頂是

」(」,直接放進去;

(2)如果當前運算子優先順序大於棧頂元素優先順序,直接放入;

(3)如果當前運算子優先順序小於等於棧頂元素優先順序,棧頂元素出棧,並且入s1

棧; (4)遇到

」)」,運算子出棧,入

s1棧,直到遇到

」(」, 」( )」

要丟掉; 4

、s1中的元素依次出棧,入

s2棧; 5

、s2棧中元素出棧重新組成表示式即為字尾表示式。

以上演算法比較試用筆試的時候計算選擇或者填空題,用**實現的時候我選擇了用乙個棧和乙個字串去實現。比如程式設計實現將中綴表示式轉成字首表示式,如a+b*(c-d)-e/f轉成-+a*b-cd/ef。首先我們要考慮運算子的優先順序問題,除去括號的優先順序,就是先乘除後加減,我是用的定義巨集來處理這個問題,當然還有更好的處理方法大家可以給我意見,定義巨集比較通俗易懂所以我就暫且這樣使用了。然後就開始入棧出棧了,規則是遇到字元就放到定義好的字串中,遇到運算子就入棧。因為是中綴轉字首,所以要從右往左遍歷表示式。運算子入棧的規則是,棧空時運算子直接入棧;棧不空時,當「+」或「-」入棧要與棧頂元素的優先順序比較,若小於棧頂元素,需要將比即將要入棧元素大的元素都依次出棧,放入字串中,然後將「+」或「-」入棧,反之直接入

棧(注意:將優先順序大的元素出棧後切勿忘了將「+」或「-」入棧);當遇到「*」或「/」入棧就直接入棧;還如注意的就是括號,如遇到「)」直接入棧,如遇到「(」須將元素依次出棧放入字串中,直到遇到「)」即停止出棧(因為是從右至左遍歷所以先遇到右括號)。遍歷完字串後接著判斷棧是否為空,若不為空則將棧內元素依次出棧放入字串中,最後逆置字串即得到字首表示式。

(**實現較長,有較多重複**,請大家見諒)

實現**如下:

#define left 0

#define right 0

#define add  1

#define sub  2

#define multi  3

#define divide 4

char *reverse(char *str)

return str; }

char*  infix_turn_suffix(char *str)

if(rval==divide)  

}else break; }

push(&p,add);

break;

case '-':

while(!isempty(&p))

if(rval==divide)  

}else break; }

push(&p,sub);

break;

case '*':

push(&p,multi);

break;

case '/':

push(&p,divide);

break;

case '(':

while(rval!=left)

if(rval==sub)

if(rval==multi)

if(rval==divide)

} break;

case ')':

push(&p,left);

break;

default:

arr[j]=str[i];

j++;

break; }

}if(isempty(&p))

else

if(rval==sub)

if(rval==multi)

if(rval==divide)

} arr[j]='\0'; }

reverse(arr);

return arr; }

字首 中綴 字尾表示式及中綴轉字尾表示式

字首表示式 不含括號的算術表示式,而且是將運算子寫在前面,運算元寫在後面的表示式。求法 首先從右往左掃瞄表示式,從右邊第乙個字元判斷,如果當前字元是數字,則一直到字串的末尾再記錄下來 如果是運算子,則將右邊最近的兩個數字串做相應的運算,以此作為乙個新串並記錄下來。一直掃瞄到最左端停止。例子 a b ...

中綴表示式轉字首和字尾表示式

之前筆試中國電信it研發中心的時候,遇到了幾個前 中 字尾表示式的相互轉換,當時忘得差不多了,今天好好把該方面的知識好好複習,並把相關 和思路自己縷了一遍 將中綴表示式轉換為字首表示式 遵循以下步驟 1 初始化兩個棧 運算子棧s1和儲存中間結果的棧s2 2 從右至左掃瞄中綴表示式 3 遇到運算元時,...

中綴表示式 字首表示式 字尾表示式

中綴表示式 中綴記法 中綴表示式是一種通用的算術或邏輯公式表示方法,操作符以中綴形式處於運算元的中間。中綴表示式是人們常用的算術表示方法。雖然人的大腦很容易理解與分析中綴表示式,但對計算機來說中綴表示式卻是很複雜的,因此計算表示式的值時,通常需要先將中綴表示式轉換為字首或字尾表示式,然後再進行求值。...