一文看懂中綴表示式轉化成字尾表示式

2021-10-04 19:18:16 字數 3546 閱讀 6725

通過堆疊的學習,我們已經知道想要將中綴表示式轉化成字尾表示式,有以下幾步操作

1.對於運算數:直接輸出

2. 對於左括號:直接壓入棧中

3. 對於右括號將棧頂的運算子彈出並輸出,若棧頂元素不是左括號,繼續彈出,直到遇到左括號(出棧,但是不輸出)

4. 對於運算子:

• 若優先順序大於棧頂運算子時,則把他壓棧

• 若優先級小於等於棧頂運算子時,將棧頂運算子彈出並輸出:再比較新的棧頂運算子,直到該運算子大於棧頂運算子優先順序為止,然後將該運算子壓棧

5.若各物件處理完畢,則把堆疊中殘留的運算子一併輸出

#include

#include

#include

#include

using

namespace std;

intlevel

(char c)

intmain()

//執行完while之後,s.top = '(',此時需要將棧頂元素彈出,但是不列印

s.pop();

}elseif(

!s.empty()

&&level

(str[i]

)<=

level

(s.top()

))s.

push

(str[i]);

}elseif(

level

(str[i])!=

0)s.

push

(str[i]);

}while

(!s.

empty()

)return0;

}

寫出了第一代**之後發現乙個問題,就是如果數字是多位數,連續輸出多個數字時會連在一起,有沒有辦法讓兩個數字之間有間隔,數字和運算子,運算子與運算子連續呢,那我就想到了增加乙個判斷,最近一次輸出的型別是啥,若為數字,當後一次輸出也為數字時,加個空格,其他情況都不加,於是就有了第二版的**

#include

#include

#include

#include

using

namespace std;

intlevel

(char c)

intmain()

else

if(num !=0)

if(str[i]

>=

'0'&& str[i]

<=

'9')

elseif(

(str[i]

>=

'a'&& str[i]

<=

'z')

||(str[i]

>=

'a'&& str[i]

<=

'z')

)//運算數直接輸出

printf

("%c"

, str[i]);

else

if(str[i]

=='('

) s.

push

(str[i]);

else

if(str[i]

==')'

)//執行完while之後,s.top = '(',此時需要將棧頂元素彈出,但是不列印

s.pop();

type =2;

//最後乙個是運算子,type變成2

}elseif(

!s.empty()

&&level

(str[i]

)<=

level

(s.top()

))s.

push

(str[i]);

type =2;

}elseif(

level

(str[i])!=

0)s.

push

(str[i]);

}if(num !=0)

while

(!s.

empty()

)return0;

}

經過第二版之後,可以說程式已經不錯了,可以實現字母,多位整數的中綴表示式轉化成字尾表示式,那麼如何實現小數成了我下乙個為之努力的目標,我的思路時是找到小數點,小數點前後整合成乙個浮點數,再輸出乙個浮點數,這是我乙個好盆友提醒我,你思維定勢了,你完全可以將『.』當成乙個操作符進行輸出,轉念一想,好有道理,而且實現起來簡單好多,於是就有了第三版

#include

#include

#include

#include

using

namespace std;

intlevel

(char c)

intmain()

else

if(num !=0)

if(str[i]

>=

'0'&& str[i]

<=

'9')

else

if(str[i]

=='.'

)elseif(

(str[i]

>=

'a'&& str[i]

<=

'z')

||(str[i]

>=

'a'&& str[i]

<=

'z')

)//運算數直接輸出

printf

("%c"

, str[i]);

else

if(str[i]

=='('

) s.

push

(str[i]);

else

if(str[i]

==')'

)//執行完while之後,s.top = '(',此時需要將棧頂元素彈出,但是不列印

s.pop();

type =2;

//最後乙個是運算子,type變成2

}elseif(

!s.empty()

&&level

(str[i]

)<=

level

(s.top()

))s.

push

(str[i]);

type =2;

}elseif(

level

(str[i])!=

0)s.

push

(str[i]);

}if(num !=0)

while

(!s.

empty()

)return0;

}

將中綴表示式轉化成字尾表示式

中綴變字尾主要的思想就是將需要的運算子先做乙個對映 對於任意表示式,式中從頭開始掃,遇到非運算子,即任意數字或字母直接輸出 遇到運算子考慮放入棧中 若棧空則放入 若棧不為空,判斷棧頂的優先順序是否 待放入的運算子,若 小於則將其壓入棧中 若不小於,則將棧一直 pop,知道運算子可以放入棧中 當然還有...

將中綴表示式轉化成字尾表示式(逆波蘭式)

直接上 中綴表示式 轉換成 字尾表示式 逆波蘭式 include include struct stack int get priority char c int isempty struct stack s struct stack createstack unsigned int len voi...

將中綴表示式轉化成字尾表示式來計算值

題目很簡單,就是給出乙個表示式 例如2 3 5 6 然後我們得出他的值。未接觸這個方法前,我是用了一種很複雜的方法 爆肝警告 將中綴表示式 就是我們要求的表示式 轉化成字尾表示式來解決就會比較簡單。對於中綴表示式和字尾表示式的概念這裡就不說了,只將方法呈現出來。例如乙個中綴表示式 a b c d e...