一:问题
二:理解
这个题目可以用栈来实现优先级的算术运算:
大体思想就是将‘-’,‘x’,‘/’ 转化为‘+’,
1.一遇到数字就将这个数字压栈
if(str[i]>='0' && str[i]<='9')
num.push(str[i]-'0');
2.遇到乘法‘x’,就将栈顶的数和乘法运算符后面的数进行乘法运算后,将栈顶的数出栈,最后将运算后的数入栈。(用i++来让后面这个不在遍历一遍,因为已经进行运算了)
if(str[i] == 'x') //直接计算乘法
{
int temp = num.top();
num.pop();
num.push(temp*(str[i+1]-'0'));
i++; //直接跳过下一个数
}
3.同理,遇到除法‘/’,进行除法运算即可;
else if(str[i] == '/') //直接计算除法
{
int temp = num.top();
num.pop();
num.push(temp/(str[i+1]-'0'));
i++; //直接跳过下一个数
}
4.遇到加法,不用动。遇到减法,就将这个数变成负数;
else if(str[i]=='-') //将减法转为加法
{
num.push((str[i+1]-'0')*(-1));
i++; //直接跳过下一个数
}
5.因为已经将所有的运算都转化为了加法运算,所以只要将数字栈里面的数字(其他运算已经运算完了)一个一个的加起来。
int sum=0;
while (!num.empty())
{
sum+=num.top();
num.pop();
}
看到一篇关于用栈来实现计算优先级的(写的挺好的):
参考博客
三:代码
#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
stack<int>num;
int main()
{
int n; //个数
cin >> n;
while(n--)
{
string str; //算式字符串
cin >> str;
while(!num.empty()) num.pop(); //清空栈
for(int i=0; i<str.size(); i++)
{
if(str[i]>='0' && str[i]<='9')
num.push(str[i]-'0');
else
{
if(str[i] == 'x') //直接计算乘法
{
int temp = num.top();
num.pop();
num.push(temp*(str[i+1]-'0'));
i++; //直接跳过下一个数
}
else if(str[i] == '/') //直接计算除法
{
int temp = num.top();
num.pop();
num.push(temp/(str[i+1]-'0'));
i++; //直接跳过下一个数
}
else if(str[i]=='-') //将减法转为加法
{
num.push((str[i+1]-'0')*(-1));
i++; //直接跳过下一个数
}
}
}
int sum=0;
while (!num.empty())
{
sum+=num.top();
num.pop();
}
if(sum==24)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}
第二次写的代码:
这次基本上的思路都能够写出来了,遇到数先入栈,遇到符号就有不同的操作(’+‘号):直接将下个数入栈即可 num.push(str[++i]-‘0’);
(’-'号):将下一个数置为相反数入栈 num.push(-(str[++i]-‘0’));
('x’号):先将栈顶的元素取出(并且将其出栈)和下一个数相乘,然后再入栈
int temp = num.top();
num.pop();
num.push(temp*(str[++i]-'0'));
(’/'号):同理:
int temp = num.top();
num.pop();
num.push(temp/(str[++i]-'0'));
注意:开始的数都是字符的形式,需要转化为int型。
遇到另外一个问题:
对于栈的操作:
取出栈的值:num.top();
入栈操作:num.push();
出栈操作: num.pop();
#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
stack<int>num;
int main()
{
int n;
cin >> n;
while(n--)
{
string str;
cin >> str;
for(int i=0; i<7; i++)
{
if((str[i])>='0' && (str[i])<='9')
num.push(str[i]-'0');
else
{
if(str[i] == '+')
num.push(str[++i]-'0');
else if(str[i] == '-')
num.push(-(str[++i]-'0'));
else if(str[i] == 'x')
{
int temp = num.top();
num.pop();
num.push(temp*(str[++i]-'0'));
}
else
{
int temp = num.top();
num.pop();
num.push(temp/(str[++i]-'0'));
}
}
}
int counts = 0;
while(!num.empty())
{
int temp = num.top();
num.pop();
counts += temp;
}
if(counts == 24)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
return 0;
}