目录
[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为非负整数。
卡特兰数在许多组合问题中都有重要的应用,比如:
-
括号匹配问题:对于给定数量的左右括号,计算可以生成的正确的括号组合数。
-
凸多边形划分:对于给定的n个点组成的凸多边形,计算可以将它划分成n+2个三角形的方法数。
-
栈排序问题:对于给定的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;
}