题目链接戳这里
某城市有一个火车站,有n节车厢从A方向驶入车站,按进站的顺序编号为1到n.你的任务是判断是否能让它们按照某种特定的顺序进入B方向的铁轨并驶入车站。例如,出栈顺序(5 4 1 2 3)是不可能的,但是(5 4 3 2 1)是可能的。
这里主要是建立A和B 2个对象,A是从1到N排列的车厢序列,B是希望得到的车厢序列。
程序中的A和B,是上述2个对象的当前考虑的一节车厢的下标。
分3种情况:
- 若A的当前节车厢和B中的期待这节的一样,那么A中的直接进栈后立刻出栈即可
- 若不一样,考虑是否栈头的车厢和B中期待的这节一样,若是,直接出栈
- 若栈中无,A中也不同,则考虑先将A中车厢入栈
除此外即是出错
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i,a,b) for(ll i=(a);i<(b);++i)
const int maxN = 1e3 + 5;
int N, M;
int des[maxN];
int main() {
while (~scanf("%d", &N) && N) {
while (~scanf("%d", &des[1]) && des[1]) {
rep(i, 2, N + 1)
scanf("%d", &des[i]);
int ok = 1, A = 1, B = 1;
stack<int> st;
while (B <= N) {
if (A == des[B]) { ++A; ++B; }
else if (!st.empty()
&& st.top() == des[B]){ st.pop(); ++B; }
else if (A <= N) { st.push(A++); }
else { ok = 0; break; }
}
puts(ok == 1 ? "Yes" : "No");
}
puts("");
}
return 0;
}
题目链接戳这里
矩阵链乘。遇到字母入栈,遇到')'则出2个矩阵进行运算后,结果矩阵入栈。
注意出栈的2个矩阵顺序,运算别弄反了。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define mst(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(ll i=(a);i<(b);++i)
#define rrep(i,a,b) for(ll i=(a-1);i>=b;--i)
#define fi first
#define se second
#define mp make_pair
typedef pair<int,int> rc;
const int inf = 0x3f3f3f3f, maxN = 1e4 + 5;
int N, M;
map<char, rc> ma;
int main() {
// freopen("data.in", "r", stdin);
scanf("%d\n", &N);
char nm;
int ro, co;
rep(i, 0, N) {
scanf("%c %d %d\n", &nm, &ro, &co);
ma[nm] = mp(ro, co);
}
char expr[maxN];
while (cin.getline(expr, maxN)) {
stack<rc> st;
int ok = 1, ans = 0;
for (int i = 0; expr[i] != 0; ++i) {
if (isalpha(expr[i])) {
st.push(mp(ma[expr[i]].fi, ma[expr[i]].se));
} else if (expr[i] == ')') {
if (st.size() == 1) {
break;
}
rc b = st.top(); st.pop();
rc a = st.top(); st.pop();
if (a.se != b.fi) {
ok = 0;
break;
}
rc c = mp(a.fi, b.se);
ans += a.fi * a.se * b.se;
st.push(c);
}
}
if (!ok)
printf("error\n");
else
printf("%d\n", ans);
}
return 0;
}