3 条题解
-
1
真的用栈模拟就好了啊
从头开始,按入栈顺序入栈,如果栈顶与出栈序列的最前面的数相同,就将其弹出
最后将所有入栈的数都入栈后,判断栈中剩下的数与出栈序列中剩下的数顺序相同,就按照上面的方式依次弹出,直到无法弹出或栈为空
如果栈为空,则出栈序列是合法的,输出"Yes",不为空输出"No"
#include<bits/stdc++.h> using namespace std; int main() { int q; cin>>q; while(q--) { int n; int a[100001],b[100001]; stack<int >st; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) cin>>b[i]; int head=1; for(int i=1;i<=n;i++) { st.push(a[i]); while(st.top()==b[head]) { st.pop(); head++; if(st.empty()) break; } } if(st.empty()) cout<<"Yes"<<endl; else cout<<"No"<<endl; } }
-
0
只需要根据出栈序列,模拟入栈出栈的过程,分析是否满足“后进先出”的特性就好了。 例如: 对于入栈序列 1 2 3 4,判断出栈序列能否是1 4 2 3。 首先按入栈顺序依次入栈,每当栈顶与出栈序列最前面的数相同,就将其出栈,最后如果所有元素都出栈了,说明出栈序列合法,否则不合法。 在这个例子中先将1入栈,此时栈顶元素和出栈序列最前面的数相同,1出栈。接着2、3入栈时,都和出栈序列最前面的数不同,依次入栈即可。之后4入栈,栈顶元素和出栈序列最前面的数相同,4出栈。此时栈顶元素是3,而出栈序列最前面的数是2,无法顺利出栈。总共只出栈了1和4两个元素,说明出栈序列不合法。 换言之,若当前栈顶元素等于下一个出栈序列的元素,则让栈顶元素出栈,否则只能让下一个元素进栈,最终根据出栈元素的个数是否为n来判断出栈序列是否合法。
#include<bits/stdc++.h> using namespace std; int a[100005], b[100005], sta[100005]; int q, top, n, cnt; int main(){ int T;cin>>T; while (T--){ cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= n; i++) cin >> b[i]; top = 0, cnt = 0; for (int i = 1; i <= n; i++){ top++; sta[top] = a[i]; while (top > 0 && sta[top] == b[cnt + 1]){ top--; cnt++; } } if (cnt == n) cout << "Yes" << endl; else cout << "No" << endl; } }
- 1
信息
- ID
- 534
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 6
- 标签
- 递交数
- 259
- 已通过
- 82
- 上传者