ccf20190302-二十四点

思路

开始看到题目的时候,只是想着用一个字符串将数字和符号都存起来,因为每一个数字和符号都只是占一个位,所以想之后可以再按照计算的优先顺序判断字串里的每个符号从左到右依次匹配的情况,再进行计算。应该是个可行但是有点傻的方法。

然后百度了一下看有什么较优的解法,果不其然人家总是更厉害。(https://www.cnblogs.com/xidian-mao/p/10588813.html)

引入栈来解题,这样应该能比字符串更好管理。


这里顺便再复习一下栈的用法。

使用栈时,需要引用#include<stack> 头文件,定义用stack<int> s;

栈使用的是“先进后出”原则,pop()/push()/top()等操作全都是对栈顶做的,还有size()表示栈中的元素个数,empty()表示栈是否为空。

开始在写的时候注释***处,写成了没有i++,然后括号里关于i的操作都+1,在本轮里这样是没有问题的,但是如果遇到乘除号,后面的数字位也是应该已经被取出来计算了,所以需要先加一次,然后再for循环里再加一次,跳过后面的这个数字位。否则会有重复计算

还有一条是while()/if()/for()等如果不加大括号就只会处理第一句,tab换位是没有实际代码意义的。所以还是建议每个都打上{},不管一行或多行。(因为我刚就while那里没打{},死活不出结果)。。。

 


 

题解

#include<iostream>
#include<string>
#include<stack>  
using namespace std;

int calculate(string str){
    stack<int> s;
    int flag=1;
    for(int i=0;i<str.size();i++){
        //把数字直接存入栈里,减号当成负数存入栈里 
        if(str[i]>='0' && str[i]<='9'){
            s.push(flag*(str[i]-'0'));
        }
        else if(str[i]=='-' || str[i]=='+'){
            if(str[i]=='-')
                flag=-1;
            else
                flag=1;
        }
        //1*1+9-9 
        //栈里:(栈底)1(遇到乘号,出栈) 1(1*1的结果) 9 -9 (栈顶)
        //乘除计算后,存入栈里 
        else{  //***
            int x1 = s.top();
            s.pop();
            i++;
            int x2 = str[i]-'0';
            if(str[i-1]=='/')
                s.push(x1/x2);
            else
                s.push(x1*x2);
        }
    }
    int sum = 0;
    while(!s.empty()){
        sum+=s.top();
        s.pop();
    }
    return sum;
}

int main(){
    int N;
    scanf("%d",&N);
    for(int i=0;i<N;i++){
        string str;
        cin >> str;
        if(calculate(str)==24){
            cout << "Yes" << endl;
        }
        else
            cout << "No" << endl;
    }
    return 0;
} 

 

转载于:https://www.cnblogs.com/lyeeer/p/11439287.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值