今天看了一个人写的数据结构讲解,代码可以,就是解释好差,看了一遍代码,才看懂他说的是啥。
https://blog.csdn.net/m0_64694079/article/details/128004935
第一题
C:士兵队列训练
题目描述:某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始1至2报数,凡报到2的出列,剩下的向小序号方向靠拢,再从头开始进行1至3报数,凡报到3的出列,剩下的向小序号方向靠拢,继续从头开始进行1至2报数······以后从头开始轮流进行1至2报数、1至3报数直到剩下的人数不超过三人为止。
输入格式:本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过10000。
输出格式:共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
这道题最后我理解的是。
输入一个数字,比如20,生成一个1-20的列表,然后列表索引位不断除以2和3,剩下列表小于等于3个数字则停止。
打印出最后剩余的小于等于三的几个数字的编号。
但是要求需要多组数据,所以开头cin的while循环使用于全逻辑。后面的cin输入为每次列表的数量。例如1-20或者1-40.最后输出最后剩余的的是那几个数字。
输入样例:
2
20
40
输出样例:
1 7 19
1 19 37
解题思路:使用双向链表list和计数器cnt。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int T,n;
cin>>T;
list<int> a;
list<int>:: iterator it;
while(T--)
{
a.clear();
int k=2;
cin>>n;
for(int i=1;i<=n;i++)
{
a.push_back(i);
}
while(a.size()>3)
{
int cnt=1;
for(it=a.begin();it!=a.end();)
{
if(cnt++%k==0)
it=a.erase(it);
else
{
it++;
}
}
k=(k==2?3:2);
}
for(it=a.begin();it!=a.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
}
C++ 入栈出栈
遍历输入的str字符。有左括号就入栈,遇到右括号就弹出。
如果遇到右括号,且栈内是空,则输出false
#include<bits/stdc++.h>
using namespace std;
int main()
{
char CheckBracketsStack[105];
while(cin>>CheckBracketsStack)
{
stack<char> s;
bool isok=true;
for(int i=0;i<strlen(CheckBracketsStack);i++)
{
if(CheckBracketsStack[i]=='(')
s.push(CheckBracketsStack[i]);
else
{
if(s.empty())
{
isok=false;
}
else
{
s.pop();
}
}
}
if(!s.empty()) isok=false;
cout<<(isok?"YES":"NO")<<endl;
}
}
简单的进栈出栈。不知道为什么题目介绍的这么复杂。
个人理解为:
输入必须是顺序输入。可以为1~n ,也可以为n~1。
如果错误则输出False,正确则输出yes。
题目:某城市有一个火车站,铁轨铺设如图。有n节车厢从A方向驶入车站,按进站的顺序编号为1~n。你的任务是判断是否能让他们按照某种特定的顺序进入B方向的铁轨并驶出车站。例如,出栈顺序(5 4 1 2 3)是不可能的,但(5 4 3 2 1)是可能的。 为了重组车厢,你可以借助中转站C。这是一个可以停放任意多节车厢的车站,但由于末端封顶,驶入C的车厢必须按照相反的顺序驶出C。对于每节车厢,一旦从A移入C,就不能返回A了;一旦从C移入B,就不能返回C了。也就是说,在任意时刻,只有两种选择:A到C和C到B。
输入格式:输入由多组数据组成。对于每组数据,第1行一个整数N。接下来的若干行,每行N个数,代表1到N车厢的出站顺序,最后一行只有一个整数0。
最后一组数据“N=0”,输入结束,不输出答案。 (N<=1000)
输出格式:对每行的出栈顺序都单行输出“Yes”或“No”。对每组数据都在最后输出空行。
#include<bits/stdc++.h>
using namespace std;
int B[100000];
int main()
{
int n,m;
while(cin>>n&&n)
{
while(1)
{
int i=1,j=1;
stack<int>s;
cin>>B[1];
if(!B[1]){
cout << "输出0:退出内循环" << endl;
break;
}
for(int i=2;i<=n;i++){
cin>>B[i];
cout << "入栈尾 B[" << i << "]:" << B[i] << endl;
}
while(i<=n) //循环 ,直到 i+ 到 n 为止。 i j init : 1
{
cout << "xunHuai:" << i << endl;
if(i==B[j])
{
i++;
j++;
cout << "未入栈1次:" << j << endl;
}
else
{
cout << "入栈 i:" << i << endl;
s.push(i++); //i 不等于 B[j] , 则入栈。i + 1
}
cout << "stop" << s.top() << endl;
while(!s.empty()&&s.top()==B[j])
{
j++;
s.pop();
}
}
if(j==n+1)
cout<<"Yes"<<endl;
else
{
cout<<"No"<<endl;
}
}
cout<<endl;
}
}