题目

在这里插入图片描述
201903-02二十四点 - 图2

思路

考察了中缀表达式的计算,这属于stack栈的一种运用,具体见stack的笔记。
这里有两种做法。
方法1:针对题目里的简单四则运算无括号,可以先把所有操作符看成加法,遇到不同的操作符取出栈顶数字进行计算再进栈,最后累加。(也就是简单化 中缀转后缀,直接计算)
方法2:先把中缀表达式转为后缀表达式,再计算后缀表达式

代码

方法1:

  1. stack<int> num;//操作符栈
  2. int main(){
  3. char str[14];
  4. int n;
  5. cin>>n;
  6. while(n--){
  7. cin>>str;
  8. int i=0;
  9. while(!num.empty()){
  10. num.pop();//清空栈
  11. }
  12. while(i<strlen(str)){
  13. if(isdigit(str[i])){
  14. //如果为0-9的数
  15. num.push(str[i]-'0');//把字符‘数字’变为int 数字
  16. i++;
  17. }else{
  18. if(str[i] =='+'){
  19. i++;//加法跳过
  20. }else if(str[i]=='-'){
  21. i++;
  22. num.push((str[i]-'0')*-1);
  23. i++;
  24. } else if(str[i]=='x'){
  25. int temp =num.top();
  26. num.pop();
  27. i++;
  28. num.push((str[i]-'0')*temp);
  29. i++;
  30. }else if(str[i]=='/'){
  31. int temp =num.top();
  32. num.pop();
  33. i++;
  34. num.push(temp/(str[i]-'0'));
  35. i++;
  36. }
  37. }
  38. }
  39. int sum =0;
  40. while (!num.empty())
  41. {
  42. sum += num.top();
  43. num.pop();
  44. }
  45. if (sum == 24)
  46. cout << "Yes" << endl;
  47. else
  48. cout << "No" << endl;
  49. }
  50. return 0;
  51. }