zoukankan      html  css  js  c++  java
  • 模拟一般数学表达式(中缀式)转换为后缀表达式

           注意:本文主要讲解中缀转后缀的转换方法,因此本来的数字用小写字母来表示。

    式子的表示形式;

      一般表达式(前缀表达式)比如  : a+b*c+(d+e)*f

        后缀表达式 :                               abc*+de+f*+

    为什么要转换成为后缀表达式?

      后缀式虽然我们看起来极其的麻烦,但是对于计算机来说可以非常高效地运算,计算机处理后缀表达式值时,遇见要处理的数字便压入栈,若遇到运算符时取出栈顶的两个元素,进行运算,得到的结果,再放入栈中,运算完成后栈中存的元素就是最终运算的结果。

    怎么样转换以及转换的具体代码:

      一、对于给出的中缀表达式从头到尾进行遍历

        1.遇到字母直接输出。

        2.遇到 )直接输出栈中的操作符直到( 为止,结束后再将 (   也抛出栈。

        3.若遇到运算符,只要栈顶的符号的优先级不低于当前的运算符,就不断取出栈顶中的元素输出出来,最后再将新符号进栈。(如果遇到 ’( ‘ 直接入栈)。

      二、遍历完成后,依次将栈中的元素输出出来,直到栈为空为止。

    读者可以通过代码来进一步理解:

     1 #include<iostream>
     2 #include<stack>
     3 using namespace std;
     4 
     5 stack<char>sta;
     6 string s;
     7 char ans[100];
     8 int cmp(char a,char b){
     9     if(b=='(' || a=='(')return 0;
    10     else if((b=='*'||b=='/'||b=='%')&&(a=='+'||a=='-'))return 0;
    11     else return 1;
    12 }
    13 int main(){
    14     int p=0;
    15     cin>>s;
    16     int len =s.size();
    17     for(int i=0;i<len ; i++){
    18         if(s[i]>='a'&&s[i]<='z')ans[p++]=s[i];
    19         else if(s[i]==')'){
    20             while(sta.top()!='('){
    21                 char c = sta.top();
    22                 sta.pop();
    23                 ans[p++] = c;
    24             }
    25             sta.pop();
    26         }
    27         else {
    28                 while(!sta.empty() && cmp(sta.top(),s[i])){       // 栈顶元素的优先级大于等于当前元素的优先级
    29                     char c =sta.top();
    30                     sta.pop();
    31                     ans[p++] = c;
    32                 }
    33                 sta.push(s[i]);
    34         }
    35     }
    36     while(sta.size()){
    37         char c =sta.top();
    38         ans[p++] = c;
    39         sta.pop();
    40     }
    41     ans[p]='
    ';
    42     cout<<ans<<endl;
    43     return 0;
    44 }
  • 相关阅读:
    第一次作业-准备篇
    个人作业——软件工程实践总结
    团队作业第二次—项目选题报告
    软工实践第三次作业(结对第二次作业)
    软工实践第二次作业(结对第一次作业)
    第一次作业-准备篇
    软工实践|个人作业——软件工程实践总结作业
    软工实践|团队作业第二次—项目选题报告
    软工实践|结对第二次—文献摘要热词统计及进阶需求
    软工实践|结对第一次—原型设计(文献摘要热词统计)
  • 原文地址:https://www.cnblogs.com/habit2021/p/11358104.html
Copyright © 2011-2022 走看看