7-3 中缀表达式转换为后缀表达式并求值 (20分)

把题目给出中缀表达式转换为后缀表达式输出,并求后缀表达式的值。为简单起见,我们约定:1、输入的中缀表达式一定是合法的,并且只含数字,四种运算符+、-、*、/和小括号;2、运算数都是一位正整数(1~9);3、输入的中缀表达式不超过20个字符;4、除法运算的结果仍然是正整数。

输入格式:

输入的第一行是一个正整数 N ,表示以下有 N 行。每行是一个中缀表达式。为简单起见,我们约定:1、输入的中缀表达式一定是合法的,并且只含数字,四种运算符+、-、*、/和小括号;2、运算数都是一位正整数(1~9);3、输入的中缀表达式不超过20个字符;4、除法运算的结果仍然是正整数。

输出格式:

输出每行中缀表达式所对应后缀表达式,隔一个空格之后,输出该后缀表达式计算之后得到的值。

输入样例:

在这里给出一组输入。例如:

6
2+4
3+27
2
(4+6)
(5/2+4)5+2
(3+5)
(7-2)/4
5*(8-(3+2))

输出样例:

在这里给出相应的输出。例如:

24+ 6
327*+ 17
246+* 20
52/4+5*2+ 32
35+72-4/ 10
5832±
15

题目分析:
    1.很明显题目是让你将输入的中缀表达式先转成后缀表达式,然后再在后缀表达式的基础上把算式的结果算出来。
    2.如何解决中缀表达式转换后缀表达式的问题呢?
        从左往右开始扫描中缀表达式。
        遇到数字直接加入后缀表达式
        遇到运算符时:
            a.若为’(‘则入栈
            b.若为’)‘,则依次把栈中的运算符加入后缀表达式,直到出现’(‘,从栈中删除’)‘。
            c.若为除括号外的其他运算符,当其他优先级高于除’)'外的栈顶运算符时,直接入栈。
        否则从栈顶开始,依次弹出比当前处理的运算符优先级高和优先级相等的运算符,
        直到一个比它优先级低的或遇到了一个左括号为止。
    3.如何解决后缀表达式的计算问题呢?
        顺序扫描表达式的每一项,然后根据它的类型做如下相应操作,若该项是操作数,则将其压入栈中。若该项是操作符< op >则连续从栈中取出两个操作数X和Y,形成运算X < op > Y,然后将结果计算出来,再将结果压入栈中,一直这样计算下去最后栈顶就是我们想要的结果

答案样例:

#include <bits/stdc++.h>
using namespace std;
char suffix[22];//存放后缀表达式 
stack <char> trans;//转换栈 
stack <int> jisuan;//计算栈
string str;
int N;

int caculate(int x, int y, char z){//求值要用到的运算函数 
	switch(z){
		case '-': return y-x;//注意这里的顺序 
		case '+': return x+y;
		case '*': return x*y;
		case '/': return y/x;//注意这里的顺序 
	}
}

bool op(char a, char b){//如果a优先级高于b就返回true 
	if((b =='+' || b == '-') && (a == '*' || a == '/'))
		return true;
	if((b =='*' || b == '/') && (a == '*' || a == '/'))//其实可以不写,只不过更好理解
		return false;
	return false;
}

bool isop(char a){//检验字符是否为运算符 
	if(a=='-' || a=='+' || a=='*' || a=='/')
		return true;
	return false;
}

void get_suffix(){//获取后缀表达式
	int i=0, j=0;
	while(str[i] != '\0'){
		if(isdigit(str[i])) suffix[j++] = str[i];
		else if(str[i] == '(') trans.push(str[i]);
		else if(str[i] == ')'){
			while(trans.top() != '('){
				suffix[j++] = trans.top();
				trans.pop();
			}
			trans.pop();
		}
		else if(isop(str[i])){
			if(trans.empty() || trans.top()=='(' || op(str[i],trans.top()))
				trans.push(str[i]);
			else if(!op(str[i],trans.top())){
				while((trans.top()!='(') && !op(str[i], trans.top()) && !trans.empty()){//要特别注意这里的判断条件 
					suffix[j++] = trans.top();
					trans.pop();
					if(trans.empty())
						break;
				}
				trans.push(str[i]);
			}
		}
		i++;
	}
	while(!trans.empty()){
		suffix[j++] = trans.top();
		trans.pop();
	}
	cout << suffix << " ";//输出答案 
}

void suffix_ans(){
	int i=0, ans=0;
	while(suffix[i] != '\0'){
		if(isdigit(suffix[i]))
			jisuan.push(suffix[i]-'0');
		else{
			int x = jisuan.top();
			jisuan.pop();
			int y = jisuan.top();
			jisuan.pop();
			ans = caculate(x, y, suffix[i]);
			jisuan.push(ans);
		}
		i++;
	}
	cout << ans << endl;
	jisuan.pop();
}

int main(){
	cin >> N;
	while(N--){
		memset(suffix, '\0', sizeof(suffix));
		str = "\0";
		cin >> str;
		get_suffix();		
		suffix_ans();
	}
	return 0;
}

百分百原创亲手写,我的好伙计你点个赞再走,你要是三连一下就更好了❀,点个赞再走,点个赞再走,点个赞再走,小心我晚上去宿舍找你❤❤❤

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐