本次个人程序设计要求做一个带有计算功能的程序,而要计算就离不开表达式,按照一般人的习惯,中缀表达式是一个非常常用的方式。但是,对于我们程序员来说,直接计算中缀表达式并不是那么方便,因此,通常来说我们会将中缀表达式进行转换。
不论是转成前缀表达式还是后缀表达式,通过树进行转换都是可以实现的,同时,一棵树就能完成前\中\后缀表达式的互相转换,因此如果仅仅要求转换并且频繁的转换,建立一棵树无疑是方便的。但是,对于计算而言,转换只是其中的一步,因此我们更要考虑效率问题,那么堆栈法就成了我们的首选。堆栈是一个十分有意思的数据结构,它的特点是先进后出,即如同一个瓶子一样最先放进去的东西最后才能拿出来。在这里,由于堆栈的特性,使我们的中缀转换变得十分简单,下面来大体介绍一下中缀表达式转换后缀表达式的方法:
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 }