

思路:
利用栈将中缀表达式转化为后缀表达式,然后求解后缀表达式即可。
#include<iostream>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<ctype.h>
using namespace std;
string s;
stack<char> optr;
queue<char> opnd;
map<char,int>precede;
void init(){
precede['+']=precede['-']=1;
precede['x']=precede['/']=2;
}
void change(){ //中缀->后缀
for(int i = 0; i < s.size();){
if(isdigit(s[i])){ //如果是数字,直接推入栈
opnd.push(s[i]);
i++;
}
else{
while(!optr.empty()&&precede[optr.top()]>=precede[s[i]]){ //栈顶优先级大于操作数
opnd.push(optr.top());
optr.pop();
}
optr.push(s[i]);
i++;
}
}
while(!optr.empty()){
opnd.push(optr.top());
optr.pop();
}
}
int main(void)
{
init();
int n;
cin>>n;
while (n--){
cin>>s;
while(!optr.empty()){
optr.pop();
}
change();
while(!opnd.empty()){
char ch = opnd.front();
opnd.pop();
if(isdigit(ch)){
optr.push(ch);
}
else{
int x = (int)optr.top() - '0';
optr.pop();
int y = (int)optr.top() - '0';
optr.pop();
int temp = 0;
if(ch=='+'){
temp = x+y;
}
else if(ch=='-'){
temp = y-x;
}
else if(ch=='x'){
temp = x*y;
}
else{
temp = y/x;
}
optr.push(temp+'0');
}
}
if(optr.top()-'0'==24){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
}
return 0;
}
本文介绍了一种使用栈将中缀表达式转换为后缀表达式的算法,并通过后缀表达式求解数学问题。该方法首先初始化运算符优先级,然后逐个处理输入字符串中的字符,如果是数字则直接压入操作数队列,如果是运算符则与栈顶运算符比较优先级,较高者压入队列,最后将栈中剩余运算符依次压入队列完成转换。
2万+

被折叠的 条评论
为什么被折叠?



