天天快乐编程集训队2021暑假训练-0810-数据结构题解
1.1214 数据结构练习题――线性表操作
对数组的相关操作
1.insert(插入)将要插入位置后的数据后移,并将当前赋值,长度+1
2.clear(清空),长度变为1
3.getelem(得到当前元素),直接下标访问
4.delete(删除),位置后的数据前移,长度-1
5.exit(退出),做为循环结束条件
#include <bits/stdc++.h>
using namespace std;
int a[1005];
int main()
{
//注意本题位置从1开始,所以这里初始化为1
int tot=1;
string s;
while(cin>>s,s!="exit")
{
if(s=="insert")
{
int n;
cin>>n;
while(n--)
{
int pos,x;
cin>>pos>>x;
//倒着
for(int i=tot-1;i>=pos;i--)
{
//当前的挪到后面
a[i+1]=a[i];
}
a[pos]=x;
tot++;
}
}
if(s=="getelem")
{
int pos;
cin>>pos;
cout<<a[pos]<<"\n";
}
if(s=="clear")
{
//注意本题位置从1开始,所以这里初始化为1
tot=1;
}
if(s=="delete")
{
int pos;
cin>>pos;
cout<<a[pos]<<"\n";
//正着
for(int i=pos;i<tot;i++)
{
//后一个为当前的
a[i]=a[i+1];
}
tot--;
}
}
return 0;
}
2.1218 数据结构练习题――栈
1.push(压入),把这个数字放入最后一个数后
2.top(顶),取出top-1这个数
3.pop(弹出),取出top-1,并把top减1
4.清空,把top置为0
#include <bits/stdc++.h>
using namespace std;
int a[1005];
int main()
{
int top=0;
string s;
while(cin>>s,s!="exit")
{
if(s=="push")
{
int x;
cin>>x;
a[top++]=x;
}
if(s=="top")
{
if(top == 0) cout<<"None\n";
else cout<<a[top - 1]<<"\n";
}
if(s=="pop")
{
if(top==0) cout<<"None\n";
else cout<<a[--top]<<"\n";
}
if(s=="clear")top=0;
}
return 0;
}
3.5487 栈之应用
模拟下栈操作
出栈肯定在入栈之后,每次入栈后均判断下是否要出栈即可
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
string a,b;
cin>>a>>b;
//保存答案序列
string ans="";
char st[10];
int top=0;
//初始化,均要进栈
for(int i=0,j=0;i<n&&j<n;i++)
{
//a[i]进栈
st[top++]=a[i];
ans+="in\n";
//栈有元素,去匹配
while(top>0)
{
if(b[j]==st[top-1])
{
j++,top--;
ans+="out\n";
}
else break;
}
}
if(top>0)cout<<"No.\n";
else cout<<"Yes.\n"<<ans;
cout<<"FINISH"<<"\n";
}
return 0;
}
4.4368 数据结构练习题----队列的基本操作
1.设置队首和队尾
2.入队,插入到最后一个元素后面
3.出队,把队列第一个元素删除
#include<bits/stdc++.h>
using namespace std;
int front,tail;
int q[1005];
int main()
{
string s;
while(cin>>s)
{
if(s=="exit")break;
if(s=="enq")
{
int x;
cin>>x;
q[tail++]=x;
}
if(s=="deq")
{
if(front>=tail)
{
cout<<"None\n";
continue;
}
cout<<q[front++]<<"\n";
}
if(s=="printq")
{
if(front>=tail)
{
cout<<"None\n";
continue;
}
cout<<q[front];
for(int i=front+1;i<tail;i++)cout<<' '<<q[i];
cout<<"\n";
}
}
return 0;
}
5.2936 小孩报数问题
先把n个人全放进队列,因为要指定w,所以先喊w-1个人
喊s的出列,即喊s-1人都放到队列后面,第s个出列
模拟这个过程即可
#include <bits/stdc++.h>
using namespace std;
//s最大为150,所以要150*64
string q[10005];
int main()
{
int front=0,tail=0;
int n;
cin>>n;
for(int i=0;i<n;i++)
{
string s;
cin>>s;
q[tail++]=s;
}
int w,s;
char c;
cin>>w>>c>>s;
for(int i=1;i<w;i++)
{
q[tail++]=q[front++];
}
while(front<tail)
{
for(int i=1;i<s;i++)
{
q[tail++]=q[front++];
}
cout<<q[front++]<<"\n";
}
return 0;
}
6.6173 相同行程查询
结构体勉强可以过,这里建议排序后二分
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
struct T{
string c;
int r;
ll s[1005];
int num;
}a[105];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i].c>>a[i].r;
for(int j=0;j<a[i].r;j++)cin>>a[i].s[j];
a[i].num=0;
}
int k;
cin>>k;
while(k--)
{
ll id;
cin>>id;
for(int i=0;i<n;i++)
{
int flag=0;
for(int j=0;j<a[i].r;j++)
{
if(a[i].s[j]==id)
{
a[i].num+=1;
flag=1;
break;
}
}
if(flag)break;
}
}
int q;
cin>>q;
while(q--)
{
string x;
cin>>x;
int flag1=1;
for(int i=0;i<n;i++)
{
if(a[i].c==x)
{
cout<<a[i].num<<endl;
flag1=0;
}
}
if(flag1)cout<<"0"<<endl;
}
return 0;
}
二分代码
#include <bits/stdc++.h>
using namespace std;
struct xtxc{
string s1;
int t;
string s[1005];
int num;
}l[105];
//定义一个struct数组,存储所有的人
struct person{
string name;
string train;
}p[100005];
//写排序函数
int cmp(person a,person b)
{
//按照name的字典序排列
return a.name<b.name;
}
string bs(int left, int right,string x){
int mid=(left+right)/2;
if(p[mid].name==x)
{
return p[mid].train;
}
else if(p[mid].name<x)
return bs(mid+1,right,x);
else
return bs(left,mid-1,x);
}
int main()
{
ios::sync_with_stdio(false);
//定义变量tot去保存所有的人
int tot=0;
int n1, n2, n3;
cin>>n1;
for(int i=0;i<n1;i++)
{
cin>>l[i].s1>>l[i].t;
for(int j=0;j<l[i].t;j++)
{
cin>>l[i].s[j];
p[tot].name = l[i].s[j];
p[tot].train = l[i].s1;
tot++;
}
l[i].num=0;
}
//想要二分必须先有序
sort(p,p+tot,cmp);
cin>>n2;
//b和c之后并不需要,我们可以不用数组,比如直接用x
string x;
for(int i=0;i<n2;i++)
{
cin>>x;
//先进行搜索,搜索返回下标或者train均可
string train = bs(0,tot,x);
//n1很小,可以直接遍历
for(int j=0;j<n1;j++)
{
if(train==l[j].s1)
{
l[j].num++;
}
}
}
cin>>n3;
for(int i=0;i<n3;i++)
{
cin>>x;
int flag=0;
for(int j=0;j<n1;j++)
{
if(x==l[j].s1)
{
cout<<l[j].num<<endl;
flag=1;
break;
}
}
//没被标记就是没有
if(flag==0)
cout<<"0"<<endl;
}
}
``
本文来自博客园,作者:暴力都不会的蒟蒻,转载请注明原文链接:https://www.cnblogs.com/BobHuang/p/15122920.html