本次个人程序设计要求做一个带有计算功能的程序,而要计算就离不开表达式,按照一般人的习惯,中缀表达式是一个非常常用的方式。但是,对于我们程序员来说,直接计算中缀表达式并不是那么方便,因此,通常来说我们会将中缀表达式进行转换。

不论是转成前缀表达式还是后缀表达式,通过树进行转换都是可以实现的,同时,一棵树就能完成前\中\后缀表达式的互相转换,因此如果仅仅要求转换并且频繁的转换,建立一棵树无疑是方便的。但是,对于计算而言,转换只是其中的一步,因此我们更要考虑效率问题,那么堆栈法就成了我们的首选。堆栈是一个十分有意思的数据结构,它的特点是先进后出,即如同一个瓶子一样最先放进去的东西最后才能拿出来。在这里,由于堆栈的特性,使我们的中缀转换变得十分简单,下面来大体介绍一下中缀表达式转换后缀表达式的方法:

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 }