知识点
栈
#include<iostream>
#include<stack>
using namespace std;
int main(){
stack<int> st;
int n;
cin>>n;
while(n!=0){
st.push(n%10);
n/=10;
}
while(!st.empty()){
//使用前必须判断栈不为空
cout<<st.top()<<" ";//拿栈顶
st.pop();//出栈
}
return 0;
}
队列
#include<iostream>
#include<queue>
using namespace std;
int main(){
queue<int>q;
int n,x;
cin>>n;
for(int i=1;i<=n;i++){
cin>>x;
if(x%2==0){
q.push(X);
}
}
//while(q.size())
while(!q.empty()){
cout<<q.front()<<" ";
q.pop();
cout<<q.back()<<" ";
}
return 0;
}
出栈序列合法性判断
题目描述
已知自然数 1,2,⋯,N(1≤N≤100)依次入栈,请问序列 C1,C2,⋯,CN 是否为合法的出栈序列。
输入描述
输入包含多组测试数据。
每组测试数据的第一行为整数N(1≤N≤100),当 N 为 0 时,输入结束。
第二行为 N 个正整数,以空格隔开,为出栈序列。
输出描述
对于每组输入,输出结果为一行字符串。
如给出的序列是合法的出栈序列,则输出 Yes
,否则输出 No
。
输入样例
5
3 4 2 1 5
5
3 5 1 4 2
0
输出样例
Yes
No
代码
#include<iostream>
#include<stack>
#include<cstdio>
using namespace std;
int main(){
int n;
int a[105];
int m;
while(~scanf("%d",&n)){
stack<int> st;
if(n==0){
break;
}
for(int i=1;i<=n;i++){
cin>>a[i];
}
bool f=1;
m=1;
for(int i=1;i<=n;i++){
while(m<=a[i]){
st.push(m);
m++;
}
if(st.top()==a[i]&&!st.empty()){
st.pop();
}
else{
f=0;
printf("No\n");
break;
}
}
if(f==1){
printf("Yes\n");
}
}
return 0;
}
士兵报数
题目描述
某部队进行新兵队列训练,新兵一共有 n 个人,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:
1.从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢。
2.如果此时人数小于等于三人,则结束报数。
3.再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢。
4.如果此时人数小于等于三人,则结束报数。
之后从头开始重复进行上述的报数规则,直到剩下的人数不超过三人为止。
输入描述
多组输入。
第一行:输入一个正整数 t,表示测试样例组数。
接下来 t 行:每行输入一个正整数,表示士兵初始人数 n 。
输出描述
输出 t 行,表示剩下的人的编号。
输入样例
6
3
4
5
9
20
40
输出样例
1 2 3
1 3
1 3 5
1 7
1 7 19
1 19 37
数据描述
100%的数据下:1≤t,n≤5000
代码
#include<iostream>
#include<queue>
using namespace std;
int main(){
int t,n;
cin>>t;
while(t--){
queue<int>q;
cin>>n;
for(int i=1;i<=n;i++){
q.push(i);
}
if(n<=3){
for(int i=1;i<=n;i++){
cout<<i<<" ";
}
cout<<endl;
continue;
}
int len=q.size();
while(len>3){
for(int i=1;i<=len;i++){
int x=q.front();
q.pop();
if(i%2!=0){
q.push(x);
}
}
len=q.size();
if(len<=3){
break;
}
for(int i=1;i<=len;i++){
int x=q.front();
q.pop();
if(i%3!=0){
q.push(x);
}
}
len=q.size();
}
while(!q.empty()){
cout<<q.front()<<" ";
q.pop();
}
cout<<endl;
}
return 0;
}
愚人节礼物
题目描述
愚人节这天,小可想了个愚人的好办法——送礼物。嘿嘿,不要想的太好,这礼物可没那么简单,小可为了愚人,准备了一堆盒子,其中有一个盒子里面装了礼物。盒子里面可以再放零个或者多个盒子。假设放礼物的盒子里不再放其他盒子。
用()表示一个盒子,B表示礼物,小可想让你帮她算出愚人指数,即最少需要拆多少个盒子才能拿到礼物。
输入描述
本题目包含多组测试,请处理到文件结束。
每组测试包含一个长度不大于1000,只包含( ) B
三种字符的字符串,代表小可设计的礼物透视图。
每个透视图画的都是合法的。
输出描述
对于每组测试,请在一行里面输出愚人指数。
输入样例
((((B)()))())
(B)
输出样例
4
1
数据描述
100%的数据下:字符串长度不超过1000,且输入组数不超过1000
代码
#include<iostream>
#include<stack>
#include<string>
#include<cstdio>
using namespace std;
string s;
int main(){
while(cin>>s){
int cnt=0;
int len=s.size();
for(int i=0;i<=len;i++){
if(s[i]=='('){
cnt++;
}
if(s[i]==')'){
cnt--;
}
if(s[i]=='B'){
break;
}
}
cout<<cnt<<endl;
}
return 0;
}