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