本次個人程序設計要求做一個帶有計算功能的程序,而要計算就離不開表達式,按照一般人的習慣,中綴表達式是一個非常常用的方式。但是,對於我們程序員來說,直接計算中綴表達式並不是那么方便,因此,通常來說我們會將中綴表達式進行轉換。
不論是轉成前綴表達式還是后綴表達式,通過樹進行轉換都是可以實現的,同時,一棵樹就能完成前\中\后綴表達式的互相轉換,因此如果僅僅要求轉換並且頻繁的轉換,建立一棵樹無疑是方便的。但是,對於計算而言,轉換只是其中的一步,因此我們更要考慮效率問題,那么堆棧法就成了我們的首選。堆棧是一個十分有意思的數據結構,它的特點是先進后出,即如同一個瓶子一樣最先放進去的東西最后才能拿出來。在這里,由於堆棧的特性,使我們的中綴轉換變得十分簡單,下面來大體介紹一下中綴表達式轉換后綴表達式的方法:
1.遇到操作數時,直接輸出到后綴表達式中
2.當棧為空時,遇到運算符,則將運算符壓入棧中
3.當遇到左括號,將左括號壓入棧
4.當遇到右括號,將右括號拋棄,燃火執行出棧操作,並將出棧的元素輸出到后綴表達式,直到彈出棧的是左括號,左括號不輸出直接拋棄。
5.遇到其他運算符時,即加減乘除,彈出所有優先級大於或者等於該運算符的棧頂元素,然后將該運算符入棧
6.最后,當中綴表達式全部輸出或壓入棧后,將棧中的元素依次出棧,輸出到后綴表達式中。
而中綴表達式轉換前綴表達式的方法大體相似,不再贅述。
最后,附上一個轉換程序。
1 void change(std::string in){ 2 3 std:: stack<char> stack; 4 5 for(size_t i = 0; i != in.size(); i++){ 6 if(in[i] == ')' ){ 7 while(true ){ 8 char tmp = stack.top(); 9 stack.pop(); 10 if(tmp != '(' ){ 11 std::cout << tmp; 12 } 13 else{ 14 break; 15 } 16 } 17 } 18 else if (in[i] == '+' || in[i] == '-'){ 19 if(stack.top() == '*' || stack.top() == '/'){ 20 while(stack.top() == '*' || stack.top() == '/'){ 21 std::cout << stack.top(); 22 stack.pop(); 23 } 24 std::cout << in[i]; 25 } 26 else{ 27 stack.push(in[i]); 28 } 29 } 30 else if (in[i] == '(' || in[i] == '*' || in[i] == '/' ){ 31 stack.push(in[i]); 32 } 33 else{ 34 std::cout << in[i]; 35 } 36 } 37 while(stack.size()){ 38 std::cout << stack.top(); 39 stack.pop(); 40 } 41 }