舉個簡單的例子,平常我們寫的數學表示式a+b,就是一種中綴表示式,寫成字尾表示式就是ab+。再舉乙個複雜的例子,中綴表示式(a+b)*c-(a+b)/e的逆波蘭式是ab+c*ab+e/-。
(1)首先,需要分配1個棧,用於臨時儲存運算子,此運算子在棧內遵循越往棧頂優先順序越高的原則;
(2)從中綴式的左端開始逐個讀取字元x,逐序進行如下步驟:
1.若x是運算元,,將x直接加入ans後邊;
2.若x是運算子,則分情況討論:
若x是'(',則直接壓入棧s;
若x是')',則將距離棧s棧頂的最近的'('之間的運算子,逐個出棧,依次加入ans,此時拋棄'(';
若x是除'('和')'外的運算子,則再分如下情況討論:
若當前棧s的棧頂元素為'(',則將x直接壓入棧s;
若當前棧s的棧頂元素不為'(',則將x與棧s的棧頂元素比較,若x的優先順序大於棧頂運算子優先順序,則將x直接壓入棧s。否者,將棧頂運算子彈出,加入ans,直到棧頂運算子優先級別低於(不包括等於)x的優先順序,此時再則將x壓入棧;
【第二步是乙個迴圈,要把中綴式讀完。第三步是在迴圈之外】
(3)在進行完(2)後,檢查棧是否為空,若不為空,則將棧中元素依次彈出並加入ans
(4)完成上述步驟後,ans便為逆波蘭式輸出結果。
#includeusing namespace std;
int judge(char data)
return res;
}string getnibolan(string str)
else
}if(s.empty())
s.push(cur);
}else}}
//問題1 忘記了輸出出棧中的所有元素
while (!s.empty())
return newstr;
}int main()
}else
}return s.top();
}};
為了方便程式,我們一般在中綴式轉逆波蘭式的時候,用乙個列表裝下每乙個token(數字要拼接好) 。 字串 中綴 字尾 計算表示式的值
includeusing namespace std include define maxsize 100 stackstack1 棧來放字尾表示式的符號 char suffix maxsize 轉化後的字尾表示式 int n 1 表示suffix字元陣列的index,初始化為 1 int prio...
求字串表示式的值
求字串表示式的值,這裡主要使用的知識是棧.為了更好的使用,這裡定義乙個棧標頭檔案,其中包括基本的棧操作.ifndef stack h define stack h typedef char datatype typedef struct stack void init stack stack s,i...
如何計算字串表示式
using system using system.codedom using system.codedom.piler using microsoft.csharp using system.reflection public class eval r n public object getval...