逆波蘭表示式又叫做字尾表示式。在通常的表示式中,二元運算子總是置於與之相關的兩個運算物件之間,所以,這種表示法也稱為中綴表示。波蘭邏輯學家j.lukasiewicz於2023年提出了另一種表示表示式的方法。按此方法,每一運算子都置於其運算物件之後,故稱為字尾表示。
逆波蘭表示式
逆波蘭表示式,它的語法規定,表示式必須以逆波蘭表示式的方式給出。逆波蘭表示式又叫做字尾表示式。這個知識點在資料結構和編譯原理這兩門課程中都有介紹,下面是一些例子:
正常的表示式 逆波蘭表示式
a+b ---> a,b,+
a+(b-c) ---> a,b,c,-,+
a+(b-c)*d ---> a,b,c,-,d,*,+
a+d*(b-c)--->a,d,b,c,-,*,+
a=1+3 ---> a=1,3 +
http=(smtp+http+telnet)/1024 寫成什麼呢?
逆波蘭表示式的用途
逆波蘭表示式是一種十分有用的表示式,它將複雜表示式轉換為可以依靠簡單的操作得到計算結果的表示式。例如(a+b)*(c+d)轉換為ab+cd+*
逆波蘭表示式的優勢
它的優勢在於只用兩種簡單操作,入棧和出棧就可以搞定任何普通表示式的運算。其運算方式如下:
如果當前字元為變數或者為數字,則壓棧,如果是運算子,則將棧頂兩個元素彈出作相應運算,結果再入棧,最後當表示式掃瞄完後,棧裡的就是結果。
一般演算法
將乙個普通的中序表示式轉換為逆波蘭表示式的一般演算法是:
(1)首先構造乙個運算子棧,此運算子在棧內遵循越往棧頂優先順序越高的原則。
(2)讀入乙個用中綴表示的簡單算術表示式,為方便起見,設該簡單算術表示式的右端多加上了優先順序最低的特殊符號「#」。
(3)從左至右掃瞄該算術表示式,從第乙個字元開始判斷,如果該字元是數字,則分析到該數字串的結束並將該數字串直接輸出。
(4)如果不是數字,該字元則是運算子,此時需比較優先關係。
做法如下:將該字元與運算子棧頂的運算子的優先關係相比較。如果,該字元優先關係高於此運算子棧頂的運算子,則將該運算子入棧。倘若不是的話,則將棧頂的運算子從棧中彈出,直到棧頂運算子的優先順序低於當前運算子,將該字元入棧。
(5)重複上述操作(3)-(4)直至掃瞄完整個簡單算術表示式,確定所有字元都得到正確處理,我們便可以將中綴式表示的簡單算術表示式轉化為逆波蘭表示的簡單算術表示式。
演算法流程
下面是程式化演算法流程:
1、建立運算子棧stackoperator用於運算子的儲存,壓入'\0'。
2、預處理表示式,正、負號前加0(如果乙個加號(減號)出現在最前面或左括號後面,則該加號(減號)為正負號) 。
3、順序掃瞄表示式,如果當前字元是數字(優先順序為0的符號),則直接輸出該數字;如果當前字元為運算子或括號(優先順序不為0的符號),則判斷第4點 。
4、若當前運算子為'(',直接入棧;
若為')',出棧並順序輸出運算子直到遇到第乙個'(',遇到的第乙個'('出棧但不輸出;
若為其它,比較stackoperator棧頂元素與當前元素的優先順序:
如果 棧頂元素運算子優先順序 >= 當前元素的優先順序,出棧並順序輸出運算子直到 棧頂元素優先順序 < 當前元素優先順序,然後當前元素入棧;
如果 棧頂元素 < 當前元素,直接入棧。
5、重複第3點直到表示式掃瞄完畢。
6、順序出棧並輸出運算子直到棧頂元素為'\0'。
int precedence(char sign)
switch(sign)
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '^':
case '%':
return 3;
case '(':
case '@':
default:
return 0;
/****************中綴表示式轉換成字尾表示式 ********************/
void change(char* s1,char* s2)
seqstack t;
int i=0,j=0;
char ch;
setnull(&t);
push(&t,'@');
ch=s1[i];
while(ch!='\0')
if(ch==' ')
ch=s1[++i];
else if(ch=='(')
push(&t,ch);
ch=s1[++i];
else if(ch==')')
while(gettop(&t)!='(')
s2[j++]=pop(&t);
pop(&t);
ch=s1[++i];
else if(ch=='+' || ch=='-' ||ch=='*' ||ch=='/' ||ch=='^' ||ch=='%')
char w=gettop(&t);
while(precedence(w)>=precedence(ch))
s2[j++]=w;
pop(&t);
w=gettop(&t);
push(&t,ch);
ch=s1[++i];
else
while((ch>='0' && ch<='9')||ch=='.')
s2[j++]=ch;
ch=s1[++i];
s2[j++]=' ';
ch=pop(&t);
while(ch!='@')
s2[j++]=ch;
ch=pop(&t);
s2[j++]='\0';
優先順序分類
優先順序分為棧內優先順序isp(in stack priority)和棧外優先順序icp(in coming priority)。除了括號以外,其他運算子進棧後優先順序都公升1,這樣可以體現在中綴表示式中相同優先順序的操作符自左向右計算的要求,讓位於棧頂的操作符先退棧並輸出。
各運算子及符號優先順序:
操作符#
^*,/,%
+,- ()
isp075
318icp06
4281
波蘭表示式 逆波蘭表示式
中綴表示式是最常見的運算表示式,如 3 5 2 6 1 波蘭表示式又稱為字首表示式,它是由中綴表示式經過一定的方式轉換來的 比如中綴表示式為 3 5x 2 6 1 對應的字首表示式為 3 x 5 2 6 1 對於中綴表示式從右向左遍歷轉換為字首表示式,中途要是用棧進行儲存 轉換規則如下 波蘭表示式 ...
波蘭逆波蘭表示式
實現乙個基本的計算器來計算簡單的表示式字串。表示式字串只包含非負整數,算符 左括號 和右括號 整數除法需要 向下截斷 你可以假定給定的表示式總是有效的。所有的中間結果的範圍為 231,231 1 class solution s2.push s.substr l,r l l r 碰見符號 else ...
波蘭表示式與逆波蘭表示式
2018年09月03日 11 29 15 jitwxs 閱讀數 70 標籤 波蘭 字首 更多 個人分類 演算法與資料結構 常見的算術表示式,稱為中綴表示式,例如 5 6 4 2 3波蘭表示式也稱為字首表示式,以上面的例子為例,其波蘭表示式為 5 6 4 2 3中綴表示式轉換字首表示式的操作過程為 1...