【洛谷】 P1449 后缀表达式 题解

后缀表达式

题目链接

后缀表达式

题目描述

所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。

如: 3*(5-2)+7 \texttt{3*(5-2)+7} 3*(5-2)+7 对应的后缀表达式为: 3.5.2.-*7.+@ \texttt{3.5.2.-*7.+@} 3.5.2.-*7.+@。在该式中,@ 为表达式的结束符号。. 为操作数的结束符号。

输入格式

输入一行一个字符串 s s s,表示后缀表达式。

输出格式

输出一个整数,表示表达式的值。

样例 #1

样例输入 #1

3.5.2.-*7.+@

样例输出 #1

16

提示

数据保证, 1 ≤ ∣ s ∣ ≤ 50 1 \leq |s| \leq 50 1s50,答案和计算过程中的每一个值的绝对值不超过 1 0 9 10^9 109

题解思路

后缀表达式(也称为逆波兰表达式)是一种数学表达式的表示方法,其中运算符在操作数之后。后缀表达式不依赖于括号来表示运算符的优先级,而是通过运算符的位置来确定运算的顺序。
根据后缀表达式的性质,我们在遇到数字的时候将数字根据顺序拼接计算好后再存储到栈里。当读到运算符时,将前两个数字取出进行运算,并将运算结果存入栈。需要注意的是,从栈中取出的第一个数运算时应该放在后面。
对栈还不太清楚的,可以先看下我写的 栈模板 。这道题可以使用C++的stl,也可以使用数组构造出来的栈结构,这道题与 栈模板 使用了同样的自定义类,但是根据题目需求,稍有更改。根据题目所给数据范围,本题使用 long long就足够了,而且是有符号的数。

题解代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 100;

class MyStack
{
private:
    int i = 0;
    ll nums[N];
public:
    void push(ll x)
    {
        if (i < N)
        {
            nums[i++] = x;
        }
    }
    void pop()
    {
        if (i > 0)
        {
            i--;
        }
    }
    ll top()
    {
        if (i > 0)
        {
            return nums[i - 1];
        }
        else
        {
            return -1;
        }
    }
    int size()
    {
        return i;
    }
};
MyStack st;

void cal(char c)
{
    ll num2 = st.top();
    st.pop();
    ll num1 = st.top();
    st.pop();

    if (c == '+')
    {
        num1 = num1 + num2;
    }
    if (c == '-')
    {
        num1 = num1 - num2;
    }
    if (c == '*')
    {
        num1 = num1 * num2;
    }
    if (c == '/')
    {
        num1 = num1 / num2;
    }
    // printf("%lld\n", num1);
    st.push(num1);
}

int main()
{
    string s;
    cin >> s;
    ll num0 = 0;
    for (int i(0); i < s.size(); ++i)
    {
        if (s[i] >= '0' && s[i] <= '9')
        {
            num0 = num0 * 10 + (s[i] - '0');
        }
        if(s[i] == '.')
        {
            st.push(num0);
            num0 = 0;
        }
        if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/')
        {
            cal(s[i]);
        }
    }
    printf("%lld\n", st.top());
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
过河卒是一个典型的动态规划问题。首先,我们将整个棋盘看作一个二维数组,数组的每个元素表示到达该位置的路径数目。然后,我们根据题目给出的条件,逐步更新数组中的元素,直到计算出到达目标位置的路径数目。 具体的解题思路如下: 1. 首先,我们可以将马的位置设置为0,表示无法经过该位置。 2. 然后,我们根据马的位置,更新数组中的元素。对于二维数组中的每个位置,我们根据左边和上边的位置来计算到达当前位置的路径数目。具体地,如果左边和上边的位置都可以经过,那么到达当前位置的路径数目就等于左边和上边位置的路径数目之和。如果左边或上边的位置无法经过,那么到达当前位置的路径数目就等于左边或上边位置的路径数目。 3. 最后,我们输出目标位置的路径数目。 下面是洛谷p1002过河卒题解的C++代码: ```cpp #include <bits/stdc++.h> using namespace std; int main() { long long a[21][21]; int x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2; // 初始化数组,马的位置设置为0 for(int i=0; i<=20; i++) { for(int k=0; k<=20; k++) { a[i][k] = 1; } } a[x2][y2] = 0; // 根据马的位置更新数组中的元素 if(x2 >= 2 && y2 >= 1) a[x2-2][y2-1] = 0; if(x2 >= 1 && y2 >= 2) a[x2-1][y2-2] = 0; if(x2 <= 18 && y2 >= 1) a[x2+2][y2-1] = 0; if(x2 <= 19 && y2 >= 2) a[x2+1][y2-2] = 0; if(x2 >= 2) a[x2-2][y2+1] = 0; if(x2 >= 1) a[x2-1][y2+2] = 0; if(y2 >= 1) a[x2+2][y2-1] = 0; if(y2 >= 2) a[x2+1][y2-2] = 0; // 动态规划计算路径数目 for(int i=1; i<=20; i++) { for(int k=1; k<=20; k++) { if(a[i][k] != 0) { a[i][k] = a[i-1][k] + a[i][k-1]; } } } // 输出目标位置的路径数目 cout << a[x1][y1] << endl; return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值