【数据结构基础 | 链表练习】例题6-4 破损的键盘
//链表
#include
#include
const int maxn=100000+5;
int last,cur,next[maxn];
//光标位于cur号字母的后面
char s[maxn];
int main()
{
while(scanf("%s",s+1)==1){
int n=strlen(s+1);
//输入保存在s[1]、s[2]中
last=cur=0;
//记得初始化
next[0]=0;
for(int i=1;
i<=n;
i++)
{
char ch=s[i];
if(ch=='[') cur=0;
else if (ch==']') cur=last;
else{
next[i]=next[cur];
//下一个字符的位置,记录在数组里面
next[cur]=i;
if(cur==last) last=i;
//更新最后一个字符的编号
cur=i;
//移动光标
}
}
for(int i=next[0];
i!=0;
i=next[i])
printf("%c",s[i]);
printf("\n");
}
return 0;
}
例题6-5 移动盒子
//双向链表
#include
#include
using namespace std;
const int maxn=100000+5;
int n,left[maxn],right[maxn];
//n个盒子inline void link(int L, int R)
{
right[L]=R;
left[R]=L;
}int main()
{
int m,kase=0;
//m条指令
while(scanf("%d%d",&n,&m)==2){
for(int i=1;
i<=n;
i++)
{
left[i]=i-1;
right[i]=(i+1)%(n+1);
//一致性处理
}
right[0]=1;
left[0]=n;
//初始化
int op,X,Y,inv=0;
while(m--){
scanf("%d",&op);
if(op==4) inv=!inv;
else{
scanf("%d%d",&X,&Y);
if(op==3 && right[Y]==X) swap(X,Y);
if(op !=3 &&inv)op=3-op;
if(op==1 &&X==left[Y]) continue;
if(op==2 && X==right[Y]) continue;
int LX=left[X],RX=right[X],LY=left[Y],RY=right[Y];
if(op==1)
{
link(LX,RX);
link(LY,X);
link(X,Y);
}
else if(op==2)
{
link(LX,RX);
link(Y,X);
link(X,RY);
}
else if(op==3){
if(right[X]==Y){link(LX,Y);
link(Y,X);
link(X,RY);
}
else{link(LX,Y);
link(Y,RX);
link(LY,X);
link(X,RY);
}
}
}
}
int b=0;
long long ans=0;
for(int i=1;
i<=n;
i++){
b=right[b];
if(i%2==1) ans+=b;
}
if(inv && n%2==0) ans=(long long)n*(n+1)/2-ans;
//如果链条反转了奇数次且盒子数量是偶数,那么ans就是需要做这个操作
printf("Case %d:%lld\n",++kase,ans);
}
return 0;
}
参考:
- 刘汝佳的紫书
- 链表练习:破损的键盘 移动盒子
- 原来&与&&是有区别的
推荐阅读
- 笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
- C语言学习(bit)|16.C语言进阶——深度剖析数据在内存中的存储
- 数据结构和算法|LeetCode 的正确使用方式
- 先序遍历 中序遍历 后序遍历 层序遍历
- 数据结构|C++技巧(用class类实现链表)
- 数据结构|贪吃蛇代码--c语言版 visual c++6.0打开
- 算法|算法-二分查找
- 数据结构学习指导|数据结构初阶(线性表)
- leetcode题解|leetcode#106. 从中序与后序遍历序列构造二叉树
- java|ObjectOrientedProgramming - 面向对象的编程(多态、抽象类、接口)- Java - 细节狂魔