前缀、中缀、后缀表达式及中缀转后缀表达式

前缀表达式:

不含括号的算术表达式,而且是将运算符写在前面,操作数写在后面的表达式。

求法:

首先从右往左扫描表达式,从右边第一个字符判断,如果当前字符是数字,则一直到字符串的末尾再记录下来;如果是运算符,则将右边最近的两个数字串做相应的运算,以此作为一个新串并记录下来。一直扫描到最左端停止。

例子:(a + b)* (c + d) :  *+ab+cd。理解:根据优先级,把数字位置不同,有那两个可以做运算,将运算符写在对应的数字前面,做完数字之后还有的元素,放在最前面。

中缀表达式:

是一个通用的算术或逻辑公式表达方法,操作符是以中缀形式处于操作数中间,即我们常用的算术表达方式。

注意:中缀记法中括号是必须的。计算过程中用括号将相应的操作数和运算符括起来,用于指示运算的次序。

后缀表达式:

不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)。

例子:(2 + 3)* 4 : 23+4*。理解:和前缀区别不大,是从左往右,保证数字字符的顺序位置不变即可。

分析过程:


参考代码:

#include<iostream>
#include<stack>
#include<string.h>
#include<ctype.h>//用于类型判断 
using namespace std;
stack<char> op; // 操作符栈 

char ans[1000];
int priority(char ch){
	switch(ch){
		case '(' : return -1;
		case '+':
	    case '-': return 1;
	    case '/':
	    case '*': return 2;
	}
}

bool isOperator(char ch){
	if(ch == '+' || ch == '-' || ch == '/' || ch == '*'){
		return true;
	}
	return false;
}

bool isCharacter(char ch){
	if(ch >= '0' && ch <= '9' || ch >= 'a' && ch <= 'z' 
	    || ch >= 'A' && ch <= 'Z'){
	    	return true;
		}
	    return false;
}

int main(){
	
	string str;
	while(cin >> str){
		int k = 0;
		int len = str.length();
		str[len] = '#';
		for(int i = 0; i <= len; i ++){// isdigit(str[i]) || isalpha(str[i])
			if(isCharacter(str[i])){
				ans[k ++] = str[i];
			}
			else if(isOperator(str[i])){
//				ans[k ++] = '#';
				if(op.empty()){
					op.push(str[i]);
				}
				else{
					while(!op.empty() && priority(op.top()) >= priority(str[i])){
						ans[k ++] = op.top();
						op.pop();
					}
					op.push(str[i]);
				}
			}
			else if(str[i] == '('){
				op.push(str[i]);
			}
			else if(str[i] == ')'){
				while(op.top() != '('){
					ans[k ++] = op.top();
					op.pop();
				}
				op.pop();
			}
			else if(str[i] == '#'){
				while(!op.empty()){
					ans[k ++] = op.top();
				    op.pop();
				}	
			}
		}
		cout << ans << endl;
	} 
	return 0;
} 
测试截图:



以上就是这篇的内容,欢迎指出错误和不足之处,谢谢!

猜你喜欢

转载自blog.csdn.net/kobe_jr/article/details/80377836
今日推荐