zoukankan      html  css  js  c++  java
  • 中缀表达式转换前\后缀表达式的总结

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

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

    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 }  
  • 相关阅读:
    2017蓝桥杯最大公共子串(C++B组)
    C++ memset函数用法
    2017蓝桥杯取位数(C++B组)
    2017蓝桥杯承压计算(C++ B组)
    安卓动画(Animation使用)
    2017蓝桥杯等差素数(C++B组)
    JSON取值前判断
    jstl
    centos到底下载哪个版本?
    HTML页面定时跳转方法
  • 原文地址:https://www.cnblogs.com/ljx1412/p/5246414.html
Copyright © 2011-2022 走看看