在这里插入图片描述
以上是问题的描述
**
思路:
**
我是用双向链表做的。用flag变量标记R出现的次数,是正向还是反向。如果是正向就从头删除,反向就从尾巴删除。头和尾巴用两个指针指着。
具体写的时候
一、链表结点的定义
二、读入输入数据
三、构建双向链表
四、根据RD命令进行运算
五、输出
再具体一点的细节问题
二、
1.读入回车和字符挨着 要用getchar();吃掉
2.定义字符数组的时候要初始化 即char L1 [1000000]={’\0’}
三、
1.构建的时候要分n=0;n!=0两种情况。因为n=0是【】,n!=0是 【1,2,3】
2.当n!=0时 要把字符筛出来扔掉 我是用奇偶筛的
3.第一个结点用rear存,后面的新结点用new加循环 再和rear构建指向关系 rear一直是当前结点,当最后一个时候,rear就是尾结点了
四.
1.在D的时候分 再删越界 再删空了 再删正常三种情况 和 前后顺序
2.我用flag偶数表示正序,奇数表示逆序
T=2表示n=0一个元素没有了 2=‘’啊!‘’
T=4表示 死了 要输出error了 一般 死之前都要‘’啊!‘’一下嘛~
3.在我们学校oj写 free用不了 之后我就把free删掉了,如果用的话,再定义一个指针P,指向当前结点,再free§就好了
五.
输出根据(T=0)和 (T!=0)分两个大方向;即使正常的输出,还是花样(【】,error)输出.
贴代码了 如果有不对的地方 欢迎大家批评指正 -----
#include <stdio.h>
#include <stdlib.h>
typedef struct Node //定义节点结构
{
long int data;
struct Node *next,*prior;
} Linklist;
int main(void)
{
long int num; //num计数循环输入
long int n,i=0,y; //n是元素个数,i是计数单位,y是要写人链表里的数
char l1[1000000]= {'\0'},x; //初始化操作串L1,x用来读没用的[,]
Linklist *new,*rear,*front; //new新的结点,rear尾巴,front头
//开始读入数据 顺序是RDD 2 [1,2]
scanf("%ld",&num);
while(num--)
{
int T = 0;
getchar(); //scanf后面有回车
gets(l1); //输入命令例如RRD
scanf("%ld",&n); //有多少元素
//开始赋值 front指向头 rear一直指向当前结点,之后走到最后一个变成尾结点的标志
if(n == 0)
{
getchar();
scanf("%c%c",&x,&x); //写入[] %c %c
T = 2;
}
if(n > 0)
{
getchar();
scanf("%c%ld",&x,&y); // x=[ 和 y=第一个数据
rear = (Linklist*)malloc(sizeof(Linklist)); //第一个结点特殊化 方便与new循环
rear->data = y;
front = rear;
for (i=3; i<=(2*n+1); i++) //之后的输入从第三个字符开始 到2*n+1 结束
{
if(i%2==1) //奇数是字符 ,]
scanf("%c",&x);//不加getchar();是连续输入无回车 [1 ,2,3,4]
if(i%2==0) //偶数是数字
{
scanf("%ld",&y);
new = (Linklist*)malloc(sizeof(Linklist));//数字留下来放表里
new->data = y;
rear -> next = new;
new ->prior = rear;
rear = new;
}
}//除了[1 的赋值结束括号
}//if(n>0)的括号
//开始根据命令运算
int flag=0; //用flag%2来判别是正向还是反向
i = 0; //因为要遍历L1,所以i=0;
while (l1[i]!='\0')
{
if(l1[i]=='R')
flag++;
if(l1[i]=='D')//分error,[],普通(正、反) 三种情况
{
if(T==2) //无元素可删了,越界了
{
T = 4; //死了
break;//最糟糕了 没必要循环了
}
if(front==rear)
T = 2; //删掉了最后一个元素,n==0 ;
if(flag%2==0&&T==0)
front = front -> next;//正向
if(flag%2==1&&T==0)
rear = rear -> prior;//反向
}
i++;
} //完成一次命令运算
//开始输出
if(T==0) //普通输出
{
if(flag%2==0)
{
printf("[");
while (front!=rear)
{
printf("%ld,",front->data);
front = front->next;
}
if(front == rear)
printf("%ld]\n",front->data);
}
if(flag%2==1)
{
printf("[");
while (front!=rear)
{
printf("%ld,",rear->data);
rear = rear->prior;
}
if(front == rear)
printf("%ld]\n",rear->data);
}
}
if(T!=0) //不是普通输出
{
if(T==4)
printf("error\n");
if(T==2)
printf("[]\n");
}
} //循环输入结束一次
return 0;
}