中綴表示式:便於人看;
字首表示式:又稱波蘭式,運算子在前邊,運算數在後邊;
字尾表示式:又稱逆波蘭式,運算數在前邊,運算子在後邊;
一、中綴表示式轉換字首表示式: 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 遇到運算元時,...
中綴表示式 字首表示式 字尾表示式
中綴表示式 中綴記法 中綴表示式是一種通用的算術或邏輯公式表示方法,操作符以中綴形式處於運算元的中間。中綴表示式是人們常用的算術表示方法。雖然人的大腦很容易理解與分析中綴表示式,但對計算機來說中綴表示式卻是很複雜的,因此計算表示式的值時,通常需要先將中綴表示式轉換為字首或字尾表示式,然後再進行求值。...