中綴表達式轉換前\后綴表達式的總結


本次個人程序設計要求做一個帶有計算功能的程序,而要計算就離不開表達式,按照一般人的習慣,中綴表達式是一個非常常用的方式。但是,對於我們程序員來說,直接計算中綴表達式並不是那么方便,因此,通常來說我們會將中綴表達式進行轉換。

不論是轉成前綴表達式還是后綴表達式,通過樹進行轉換都是可以實現的,同時,一棵樹就能完成前\中\后綴表達式的互相轉換,因此如果僅僅要求轉換並且頻繁的轉換,建立一棵樹無疑是方便的。但是,對於計算而言,轉換只是其中的一步,因此我們更要考慮效率問題,那么堆棧法就成了我們的首選。堆棧是一個十分有意思的數據結構,它的特點是先進后出,即如同一個瓶子一樣最先放進去的東西最后才能拿出來。在這里,由於堆棧的特性,使我們的中綴轉換變得十分簡單,下面來大體介紹一下中綴表達式轉換后綴表達式的方法:

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 }  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM