201903-1 小中大 (栈)

题目:

在这里插入图片描述
在这里插入图片描述

题目分析:

看到这个题是不是很熟悉,没错表达式求值,但是和之前的表达式求值不一样,这个表达式求值没有括号,且表达式长度固定
所以我们也可以用简化的思想来做这个题,普通的表达式求值可以分为两部分来做:
1.中缀表达式转后缀表达式
2.对后缀表达式进行运算

对于这个题,我们可以简化1,具体算法如下:
1.用两个栈遍历表达式,一个数字栈,一个符号栈
2.对于数字栈,可以直接入栈
3.对于符号栈,如果栈为空直接入栈,否则进行符号优先级比较,.当符号栈顶元素比当前符号优先级低时直接入栈
4.当符号栈顶元素比当前符号优先级高时,将栈顶元素弹出,并且弹出数字栈顶两个元素进行运算,在将运算结果压入数字栈,最后将当前元素入栈
5.当遍历过以后,看符号栈是否为空,如果不为空则将符号栈栈顶元素弹出,并且弹出数字栈顶两个元素进行运算,在将运算结果压入数字栈
6.最后将数字栈顶和24进行比较
PS:别忘了每组输入结束后清空栈哦

代码:

#include <bits/stdc++.h>

using namespace std;
string str;
stack<int>num;
stack<char>op;
int n;
void popp()
{
    int a,b,c;
    b=num.top();
    num.pop();
    a=num.top();
    num.pop();
    char x=op.top();
    op.pop();
    if(x=='+')
    {
        c=a+b;
    }
    if(x=='-')
    {
        c=a-b;
    }
    if(x=='x')
    {
        c=a*b;
    }
    if(x=='/')
    {
        c=a/b;
    }
    num.push(c);
}
int main()
{
    ios::sync_with_stdio(0);
    cin>>n;
    while(n--)
    {
        cin>>str;
        for(int i=0; i<7; i++)
        {
            if(i%2==0)
            {
                num.push(str[i]-'0');
            }
            else
            {
                if(op.empty())
                {
                    op.push(str[i]);
                }
                else
                {
                    if((str[i]=='x'||str[i]=='/')&&(op.top()=='+'||op.top()=='-'))
                    {
                        op.push(str[i]);
                        continue;
                    }
                    if((str[i]=='x'||str[i]=='/')&&(op.top()=='x'||op.top()=='/'))
                    {
                        popp();
                        op.push(str[i]);
                        continue;
                    }
                    if(str[i]=='+'||str[i]=='-')
                    {
                        popp();
                        op.push(str[i]);
                        continue;
                    }
                }
            }
        }
        while(!op.empty())
        {
            popp();
        }
        if(num.top()==24)
        {
            printf("Yes\n");
        }
        else
        {
            printf("No\n");
        }
        while(!op.empty())
        {
            op.pop();
        }
        while(!num.empty())
        {
            num.pop();
        }
    }
    return 0;
}
/*
1
9+3+4x3

10
9+3+4x3
5+4x5x5
7-9-9+8
5x6/5x4
3+5+7+9
1x1+9-9
1x9-5/9
8/5+6x9
6x7-3x6
6x4+4/5
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值