第二节 数据结构基础 课后作业
二叉树,队列,栈等
洛谷 P1196 约瑟夫问题
#include<iostream>
using namespace std;
struct node{//定义链表节点
int data;//节点的值
node *next;//单向链表
};
int main(){
int n,m;scanf("%d %d",&n,&m);
node *head,*p,*now,*prev;//定义变量
head=new node;head->data=1;head->next=NULL;//分配第一个节点,数据为1
now=head;//当前指针是头
for(int i=2;i<=n;i++){
p=new node;p->data=i;p->next=NULL;//p是新节点
now->next=p;//把申请的新节点连到前面的链表上
now=p;//尾指针后移一个
}
now->next=head;//尾指针指向头,循环链表建立完成
//链表建立完成
now=head,prev=head;//从第一个数开始数
while((n--)>1){
for(int i=1;i<m;i++){//数到m停止
prev=now;//记录上一个位置,用于下面跳过第m个节点
now=now->next;
}
printf("%d ",now->data);//输出第m个节点 含空格
prev->next=now->next;//跳过此节点
delete now;//释放节点
now=prev->next;//新的一轮
}
printf("%d",now->data);//打印最后一个节点,无空格
delete now;//释放最后一个节点
return 0;
}
洛谷 P1160 队列安排
#include<iostream>
using namespace std;
struct node{
int previd,nextid;
}nodes[100005]={0};
void insert(int x,int i,int y){
if(y==0){//左插入
nodes[i].previd=nodes[x].previd;
nodes[i].nextid=x;
nodes[x].previd=i;
nodes[nodes[i].previd].nextid=i;
}
else{//右插入
nodes[i].nextid=nodes[x].nextid;
nodes[i].previd=x;
nodes[x].nextid=i;
nodes[nodes[i].nextid].previd=i;
}
}
void dele(int d){
nodes[nodes[d].nextid].previd=nodes[d].previd;
nodes[nodes[d].previd].nextid=nodes[d].nextid;
nodes[d].nextid=nodes[d].previd=d;
}
int main(){
int n;cin>>n;
nodes[0].nextid=0;
nodes[0].previd=0;
insert(0,1,1);
for(int i=2;i<=n;i++){
int x,y;cin>>x>>y;
insert(x,i,y);
}
int m;cin>>m;//删除
while(m--){
int d;cin>>d;
dele(d);
}
for(int i=nodes[0].nextid;i;i=nodes[i].nextid){
cout<<i<<' ';
}
return 0;
}
洛谷 P1540 机器翻译
#include<bits/stdc++.h>
using namespace std;
int Hash[1010]={0};//标记内存中是否存在
queue<int>mem;//队列模拟内存
int main(){
int m,n;cin>>m>>n;
int cnt=0;
while(n--){
int word;scanf("%d",&word);
if(!Hash[word]){//如果不存在
cnt++;
mem.push(word);//单词入队尾
Hash[word]=1;//标记
while(mem.size()>m){//超内存
Hash[mem.front()]=0;
mem.pop();//删去队头单词
}
}
}
printf("%d",cnt);
return 0;
}
洛谷 P4913
#include<iostream>
using namespace std;
struct node{
int lson,rson;
};
node nodes[1000010];
int n,ans;
void preorder(int id,int sum){
if(id==0) return;
ans=max(ans,sum);
preorder(nodes[id].lson,sum+1);
preorder(nodes[id].rson,sum+1);
}
int main(){
int n;cin>>n;
for(int i=1;i<=n;i++){
cin>>nodes[i].lson>>nodes[i].rson;
}
preorder(1,1);
cout<<ans;
return 0;
}
洛谷 P3156
#include<iostream>
using namespace std;
int a[2000005];
int main(){
int n,m,b;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<m;i++){
scanf("%d",&b);
printf("%d\n",a[b]);
}
return 0;
}