模拟一般数学表达式(中缀式)转换为后缀表达式

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

式子的表示形式;

  一般表达式(前缀表达式)比如  : 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