2024/1/31 备战蓝桥杯 3-2 栈

目录

后缀表达式

[P1449 后缀表达式 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)](#P1449 后缀表达式 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn))

[P1044 [NOIP2003 普及组] 栈 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)](#P1044 [NOIP2003 普及组] 栈 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn))


后缀表达式

P1449 后缀表达式 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:模拟+stl的stack

关于stack的操作:

std::stack<type> s :定义一个type类型的栈

s.push(x) :把x放入栈中

s.top() :取出栈顶元素,但不删除

s.pop() :删除栈顶元素

s.size() :返回栈中元素的数量

s.empty() :判断栈中是否为空(栈不空:while(!s.empty()) )

完整代码:

cpp 复制代码
#include <bits/stdc++.h>
#define int long long
signed main() {
    int s = 0;
    std::string s1;
    std::stack<int> st;
    std::cin >> s1;
    int n = s1.length();
    s1 = " " + s1;
    for (int i = 1; i <= n; i++) {
        if (s1[i] >= '0' && s1[i] < '9') {
            s = s * 10 + s1[i] - '0';
            continue;
        } else if (s1[i] == '.') {
            st.push(s);
            s = 0;
            continue;
        } else if (s1[i] == '+') {
            int x = st.top();
            st.pop();
            int y = st.top();
            st.pop();
            int z = y + x;
            st.push(z);
            continue;
        } else if (s1[i] == '-') {
            int x = st.top();
            st.pop();
            int y = st.top();
            st.pop();
            int z = y - x;
            st.push(z);
            continue;
        } else if (s1[i] == '*') {
            int x = st.top();
            st.pop();
            int y = st.top();
            st.pop();
            int z = y * x;
            st.push(z);
            continue;
        } else if (s1[i] == '/') {
            int x = st.top();
            st.pop();
            int y = st.top();
            st.pop();
            int z = y / x;
            st.push(z);
            continue;
        } else if (s1[i] == '@') {
            break;
        }
    }
    std::cout << st.top();
    return 0;
}

P1044 [NOIP2003 普及组] 栈 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:用卡特兰数

卡特兰数:

卡特兰数(Catalan numbers)是一系列的整数,它们以比利时的数学家欧仁·查理·卡特兰命名。卡特兰数在组合数学中具有广泛的应用。

卡特兰数的计算公式如下:

C(n) = (2n)! / ((n + 1)! * n!)

其中,n为非负整数。

卡特兰数在许多组合问题中都有重要的应用,比如:

  1. 括号匹配问题:对于给定数量的左右括号,计算可以生成的正确的括号组合数。

  2. 凸多边形划分:对于给定的n个点组成的凸多边形,计算可以将它划分成n+2个三角形的方法数。

  3. 栈排序问题:对于给定的1到n的整数,通过栈的进出操作生成所有可能的出栈序列的方法数。

完整代码:

cpp 复制代码
#include <bits/stdc++.h>
#define int long long
const int N = 10086;
int f[N];
signed main()
{
    int n;
    std::cin >> n;
    f[0]=1,f[1]=1;
    for(int i = 2;i <= n;i ++)
    {
        for(int j = 0;j < i;j ++)
        {
            f[i]+=f[j]*f[i-j-1];
        }
    }
    std::cout<<f[n];
    return 0;
}
相关推荐
西柚小萌新1 分钟前
【计算机视觉CV:目标检测】--3.算法原理(SPPNet、Fast R-CNN、Faster R-CNN)
算法·目标检测·计算机视觉
高频交易dragon3 分钟前
Hawkes LOB Market从论文到生产
人工智能·算法·金融
脏脏a4 分钟前
C++ 容器的两把利器:优先级队列与反向迭代器
c++·反向迭代器·优先级队列
历程里程碑5 分钟前
Linux 2 指令(2)进阶:内置与外置命令解析
linux·运维·服务器·c语言·开发语言·数据结构·ubuntu
张张努力变强11 分钟前
C++ 类和对象(三):拷贝构造函数与赋值运算符重载之核心实现
开发语言·c++
_OP_CHEN12 分钟前
【算法基础篇】(五十)扩展中国剩余定理(EXCRT)深度精讲:突破模数互质限制
c++·算法·蓝桥杯·数论·同余方程·扩展欧几里得算法·acm/icpc
福楠13 分钟前
C++ STL | set、multiset
c语言·开发语言·数据结构·c++·算法
enfpZZ小狗14 分钟前
基于C++的反射机制探索
开发语言·c++·算法
炽烈小老头18 分钟前
【每天学习一点算法 2026/01/22】杨辉三角
学习·算法
MicroTech202519 分钟前
微算法科技(NASDAQ :MLGO)量子安全区块链:PQ-DPoL与Falcon签名的双重防御体系
科技·算法·安全