7-3 中缀表达式转换为后缀表达式并求值 (20分)_数据结构实验3_羊卓的杨
7-3 中缀表达式转换为后缀表达式并求值 (20分)把题目给出中缀表达式转换为后缀表达式输出,并求后缀表达式的值。为简单起见,我们约定:1、输入的中缀表达式一定是合法的,并且只含数字,四种运算符+、-、*、/和小括号;2、运算数都是一位正整数(1~9);3、输入的中缀表达式不超过20个字符;4、除法运算的结果仍然是正整数。输入格式:输入的第一行是一个正整数 N ,表示以下有 N 行。每行是一个中缀
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;
}
百分百原创亲手写,我的好伙计你点个赞再走,你要是三连一下就更好了❀,点个赞再走,点个赞再走,点个赞再走,小心我晚上去宿舍找你❤❤❤
更多推荐
所有评论(0)