04-顺序表和堆栈练习
题目描述
祖玛是一款曾经风靡全球的游戏,其玩法是:在一条轨道上初始排列着若干个彩色珠子,其中任意三个相邻的珠子不会完全同色。此后,你可以发射珠子到轨道上并加入原有序列中。一旦有三个或更多同色的珠子变成相邻,它们就会立即消失。这类消除现象可能会连锁式发生,其间你将暂时不能发射珠子。
给定轨道上初始的珠子序列,然后是玩家所做的一系列操作。你的任务是,在各次操作之后及时计算出新的珠子序列。
输入
第一行是一个由大写字母’A’~'Z’组成的字符串,表示轨道上初始的珠子序列,不同的字母表示不同的颜色。
第二行是一个数字n,表示玩家共有n次操作。
接下来的n行依次对应于各次操作。每次操作由一个数字k和一个大写字母描述,以空格分隔。其中,大写字母为新珠子的颜色。若插入前共有m颗珠子,位置0-m-1,则k ∈ [0, m]表示新珠子嵌入在轨道上的位置。
输出
输出共n行,依次给出各次操作(及可能随即发生的消除现象)之后轨道上的珠子序列。
如果轨道上已没有珠子,则以“-”表示。
输入样例
ACCBA
5
1 B
0 A
2 B
4 C
0 A
ABCCBA
AABCCBA
AABBCCBA
—
A
以下有四个方法
第三个方法存在编译错误,第四个方法存在溢出
#include<iostream>
#include<string.h>
using namespace std;
typedef struct node
{
char data;
node *prior;
node *next;
}node;//创建双向链表结构体
void init(node *N)//双链表初始化
{
N->next=NULL;
N->prior=NULL;
char datas[100];//开字符数组输入
cin>>datas;
int l=strlen(datas);//数组长度
int i=0;
node *s;//临时数组储存数据
while(l--)//尾插法,把字符串导入双链表中
{
s=new node; s->prior=NULL; s->next=NULL;
s->data=*(datas+i);
s->prior=N; N->next=s;
N=s;
i++;
}
//尾巴 在双链表最后
node *tail;
tail=new node;
tail->prior=NULL;tail->next=NULL;
tail->prior=N;
N->next=tail;
}
void printnode(node *N)//定义打印函数
{
if(N->next->next)//判断是否为空
{
N=N->next;
while(N->next)
{
cout<<N->data;
N=N->next;
}
}
else
cout<<"-";
cout<<endl;
}
node* insert(node *N,int step,char color)//创建插入函数,返回头指针
{
int i;
node *H=N;//指向头
node *s; //临时储存
for(i=0;i<step;i++)//找到位于step位置的节点
N=N->next;
s=new node;
s->next=NULL;
s->prior=NULL;
s->data=color;
s->prior=N;//插入函数关键步骤,两边顾
s->next=N->next;
N->next->prior=s;
N->next=s;
while(H->prior)//找到头
H=H->prior;
return H;//返回头
}
void find(node *N)//查找函数 !核心
{
node *k=N->next;//定义指针用于循环
int flag;//标记次数
while(k->next->next)//从第一个非空节点开始扫描
//想要在一次操作里删除三个相等的颜色组:在最外面套个while重复筛查
{
flag=1;
while((k->data)==(k->next->data))
{
flag++;//假如数据相等,次数++
k=k->next;//移动到下一个节点
}
if(flag>=3)//假如次数大于等于三
{
while(flag--)
{
k->next->prior=k->prior;//删除
k->prior->next=k->next;
k=k->prior;
}
if(N-&

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



