PTA写BUG日志——数据结构专题(算法笔记上机实战)

栈的应用

PTA甲级1051 Pop Sequence (25 分)
这题,俺稍微作弊了一下提前看了题解,确实没有思路嘤嘤嘤😭

//1051
#include<bits/stdc++.h>
using namespace std;
int m,n,k;
const int maxn=1100;
int main(){
	scanf("%d %d %d",&m,&n,&k);
	vector<int>a(n+1);
	stack<int>s; 
	while(k--){
		
		for(int i=1;i<=n;i++){
			scanf("%d",&a[i]);
		}
		//处理进栈的问题
		int now=1;
		for(int i=1;i<=n;i++){
			s.push(i);
			if(s.size()>m)break;
			while(!s.empty()&&s.top()==a[now]){
				s.pop();
				now++;
			}
		} 
		if(now==n+1)printf("YES");
		else printf("NO");
		if(k)printf("\n");
		while(!s.empty())s.pop();
	}	
	
	return 0;
} 

队列

感觉数据结构太难了,嘤嘤嘤~也是没有题解就抠不出来的题,要回炉重造的!!
PTA甲级1056

//1056
#include<bits/stdc++.h>
using namespace std;
int ng,np;
struct node{
	int w;
	int index0;
	int index;
	int rank;
};
bool cmp(node a,node b){
	return a.index0<b.index0; 
}
int main(){
	scanf("%d%d",&np,&ng);
	vector<node>w(np);
	vector<int>v(np);
	for(int i=0;i<np;i++){
		scanf("%d",&v[i]);
	}
	int num;
	queue<node>q;
	for(int i=0;i<np;i++){
		scanf("%d",&num);
		w[i].index0=num;//最后输出的顺序 
		w[i].index=i;//游戏顺序 
		w[i].w=v[num];
		
	}
	for(int i=0;i<np;i++){
		q.push(w[i]);
	}
	//处理数据
	while(!q.empty()){
		
		int size=q.size();
		//printf("size:%d\n",size);
		if(size==1){
			node temp=q.front();
			w[temp.index].rank=1;
			break;//第一名 
		}
		int group=size/ng+(size%ng==0?0:1);
		//每一组的最大值留下插入到队尾,其他删除
		node maxc;
		int maxn=-1,cnt=0;
		for(int i=0;i<size;i++){
			node temp=q.front();
			w[temp.index].rank=group+1;
			//printf("%d号的当前排名%d\n",temp.index,group+1);
			q.pop();
			cnt++;
			if(temp.w>maxn){
				maxc=temp;
				maxn=temp.w;
			}
			if(cnt==ng||i==size-1){
				cnt=0;
				maxn=-1;
				q.push(maxc);
			}
		} 
		 
	}
	sort(w.begin(),w.end(),cmp);
	for(int i=0;i<np;i++){
		if(i!=0)printf(" ");
		 printf("%d",w[i].rank);
	}
	 
	return 0;
} 

链表

静态链表的应用1

对于这一题,第一感觉是静态链表,一开始没在草稿纸上画示例图,所以写得非常糟糕,后来划过示意图,就很清晰了,虽然用的是暴力的遍历方法 以下是19/25的代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=1000000;
//静态链表
struct Node{
	int pre;
	int data;
	int next;
}node[maxn]; 
//展现链表
void show(int head ){
	int pre_p=head,p=head;
	//printf("debug\n");
	while(p!=-1){
		//printf("%05d %d %05d\n",p,node[p].data,node[p].next);
		if(p<0)printf("%d ",p);
		else printf("%05d ",p);
		
		printf("%d ",node[p].data);
		
		if(node[p].next<0)printf("%d",node[p].next);
		else printf("%05d",node[p].next);
		printf("\n");
		pre_p=p;
		p=node[p].next;
	}
	return ;
}
bool flag=false;
int head,n,k,pre=-1;


int main(){
	int nd,data,next;
	scanf("%d%d%d",&head,&n,&k);
	for(int i=0;i<n;i++){
		scanf("%d%d%d",&nd,&data,&next);
		node[nd].data=data;
		node[nd].next=next;
		//记录的pre 
	}
	//记录pre
	node[head].pre=-1; 
	int pre_c=head,p_c=node[head].next;
	while(p_c!=-1){
		node[p_c].pre=pre_c;
		pre_c=node[pre_c].next;
		p_c=node[p_c].next;
	}
	 
	//show(head);
	//如何定义反转
	int p=head;
	int count=0;
	int prelist=-1;
	int addr=p;
	int nextlist=node[p].next;
	while(p!=-1){
		nextlist=node[p].next;
		count++;
		if(count%k==0){
			//翻转
			while(p!=prelist){
				swap(node[p].next,node[p].pre );
				p=node[p].next;
			}
			//前后耦合
			if(prelist==-1){
				p=head;
				
				node[p].next=nextlist;
				node[nextlist].pre=p; 
			}else{
				p=node[p].next;
				
				node[p].next=nextlist;
				node[nextlist].pre=p;
			}
			node[addr].pre=prelist;
			if(prelist==-1){
				head=addr;
			}else{
				node[prelist].next=addr;
			}
			//更新prelist与addr的值
			prelist=addr;
			addr=nextlist;
			p=addr;
		}else{
			p=node[p].next;
			addr=p;
		} 
	}
	show(head);
	return 0;
} 

(淦,昨天写了三题题解居然忘记保存了,/(ㄒoㄒ)/~~)

也不是很难哈哈,这部分具体题解可以看《算法笔记》,个人感觉书上给的练习题里面,比较难的是第一题和最后一题(当然,因人而异啦,建议大家都自己刷一遍,尽量避免眼高手低的情况)

静态链表的应用5

PTA甲级1097
这题本身难度不大,但是涉及到两个静态链表的操作,所以建议是:

  • 画图、草稿
  • 指针用途最好记得注释或者用自己比较熟练的符号
//1097
/*
删除静态链表中绝对值相同的
被删除的元素单独一个链表
输出这两个链表 
*/ 
#include<bits/stdc++.h>
using namespace std;
const int maxn=2000000;
map<int ,bool> mp;//存储收到的元素
struct Node{
	int data;
	int next;
	int addr;
}node[maxn]; 
void show(int head){
	int p=head;
	while(p!=-1){
		printf("%05d %d ",node[p].addr,node[p].data);
		if(node[p].next<0){
			printf("%d\n",node[p].next);
		}else{
			printf("%05d\n",node[p].next);
		}
		p=node[p].next;
	}
	return;
}
int main(){
	int head,n;
	scanf("%d %d",&head,&n);
	int data,addr,next;
	for(int i=0;i<n;i++){
		scanf("%d %d %d",&addr,&data,&next);
		node[addr].addr=addr;
		node[addr].data=data;
		node[addr].next=next;
		mp[abs(data)]=true;
	}
	
	int dhead=-1,dpre=-1;
	int dp=dhead;
	int pre=head;
	int p=head;
	while(p!=-1){
		if(mp[abs(node[p].data)]==true){
			mp[abs(node[p].data)]=false;
			pre=p;
			p=node[p].next;
			continue;
		}else{
			//删除该元素
			node[pre].next=node[p].next;
			if(dhead==-1){
				dhead=p;
				dp=p;
				dpre=dhead;
				node[dp].next=-1;
				p=node[pre].next;
			} else{
				dp=p;
				node[dp].next=-1;
				node[dpre].next=dp;
				dpre=dp; 
				p=node[pre].next;
			}
		}
	}
	show(head);
	if(dhead!=-1){
		show(dhead);
	}
	
	return 0;
}

数据结构到这里就基本结束了,很多的应用,比如栈还有队列俺依旧有很大的问题😊,接下来进入提高篇的时候还得继续回来盘复~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值