• 前缀,后缀转中缀以及中缀转前缀,后缀


    已知一个只含有加减乘除的算式,算式中的优先级是括号大于乘除,大于加减。如下面的这个算式 :

    (A+B)* (C-D)/(E-F*G)

    首先把上述算式能加括号的地方都加上括号,也就是两个不同子算式上添加上括号进行区分:
    在这里插入图片描述
    中缀转前缀
    在每一个子算式中,把计算的符号提到前面,然后去掉这个子算式的括号,过程如下:
    在这里插入图片描述
    中缀转后缀
    在每一个子算式中,把计算的符号提到后面,然后去掉这个子算式的括号,过程如下:
    在这里插入图片描述
    前缀转中缀

    前 ->中:由右向左进栈,由左向右弹出栈

    过程如下所示:

    按照前缀表达式,从右向左,把每一个数字压入栈,当遇到符号时,先把符号弹出栈,然后把最接近栈顶的数字弹出到符号的左边,另一个挨着它的数字弹出到符号的右边,最后再还原式子即可。

    流程如下所示:
    在这里插入图片描述
    后缀转中缀

    后 ->中: 由左向右进栈,由右向左弹出栈

    过程如下所示:

    按照后缀表达式,从左向右,把每一个数字压入栈,当遇到符号时,先把符号弹出栈,然后把最接近栈顶的数字弹出到符号的右边,另一个挨着它的数字弹出到符号的左边,最后再还原式子即可。

    流程如下所示:
    在这里插入图片描述

    中缀转后缀为考察重点:
    【codeup 1918】 简单计算器
    题目描述:

    读入一个只包含±*/的非负整数计算表达式,计算该表达式的值

    输入格式:
    测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
    输出格式:
    对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
    实现代码:

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
     
    struct node{
    	double num;//操作数 
    	char op;//操作符 
    	bool flag;//true表示操作数,false表示操作符 
    };
     
    string str;
    stack<node> s;//操作符栈 
    queue<node> q;//后缀表达式序列 
    map<char, int> op;
     
    void change() {//将中缀转换为后缀 
    	double num;
    	node temp;
    	for(int i=0; i<str.length();) {
    		if(str[i]>='0' && str[i]<='9') {//如果是数字 
    			temp.flag=true;//标记为数字 
    			temp.num=str[i++]-'0';//记录这个操作数的第一个数位 
    			while(i<str.length() && str[i]>='0' &&str[i]<='9') {
    				temp.num=temp.num*10+str[i]-'0';//更新这个操作数 
    				i++;
    			}
    			q.push(temp);//将操作数压入后缀表达式的队列 
    		} else {//若是操作符
    //		只要操作符栈的栈顶元素比该操作符优先级高
    //      就把操作符栈栈顶元素弹出到后缀表达式中 
    			temp.flag=false;
    			while(!s.empty() && op[str[i]]<=op[s.top().op]) {
    				q.push(s.top());
    				s.pop();
    			}
    			temp.op=str[i];
    			s.push(temp);//把该操作符压入操作符栈中 
    			i++;
    		}
    	}
    //	如果操作符栈中还有操作符,就把它弹出到后缀表达式队列中 
    	while(!s.empty()) {
    		q.push(s.top());
    		s.pop();
    	}
    }
     
    double Cal() {//计算后缀表达式 
    	double temp1, temp2;
    	node cur, temp;
    	while(!q.empty()) {
    		cur=q.front();//cur记录队首元素 
    		q.pop();
    		if(cur.flag==true) s.push(cur);//若是操作数则入栈 
    		else {
    			temp2=s.top().num;//弹出第二个操作数 
    			s.pop();
    			temp1=s.top().num;//弹出第一个操作数 
    			s.pop();
    			temp.flag=true;//临时记录操作数 
    			if(cur.op=='+') temp.num=temp1+temp2;
    			else if(cur.op=='-') temp.num=temp1-temp2;
    			else if(cur.op=='*') temp.num=temp1*temp2;
    			else temp.num=temp1/temp2;
    			s.push(temp);
    		}
    	}
    	return s.top().num;//栈顶元素就是后缀表达式的值 
    }
     
    int main() {
    	op['+']=op['-']=1;//设定操作符的优先级 
    	op['*']=op['/']=2;
    	while(getline(cin, str), str!="0") {
    		for(string::iterator it=str.end(); it!=str.begin(); it--) {
    			if(*it==' ') str.erase(it);//把表达式的空格去掉 
    		}
    		while(!s.empty()) s.pop();
    		change();
    		printf("%.2f\n", Cal());
    	}
    	return 0; 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87

    代码参考:https://blog.csdn.net/qq_38054511/article/details/113126328

  • 相关阅读:
    CSS点击切换或隐藏盒子的卷起、展开效果
    Ansible自动化运维工具介绍与部署
    python flask 前奏
    Scss
    一文搞懂临床预测模型的评价
    洛谷P5724 【深基4.习5】求极差 / 最大跨度值
    CDH6.3.2之Kafka配置和命令
    压缩冗余信息
    Wireshark数据抓包分析之HTTP协议
    搞安全开发都是用什么编程语言?
  • 原文地址:https://blog.csdn.net/weixin_52605156/article/details/127581021