题目描述#
一个字符串表示打字机的命令,字符命令为下表所示:
字符 | 含义 |
---|---|
[ | 输入光标跳到行首 |
] | 输入光标跳到行尾 |
< | 输入光标往左移动一个字符,如果光标在行首,则无效果 |
> | 输入光标往右移动一个字符,如果光标在行尾,则无效果 |
英文字母 | 在光标处插入对应的英文字母,光标往后移动一个字符。 |
- | 删除光标前的一个字符,如果光标在行首,则无效果 |
+ | 删除光标后的一个字符,如果光标在行尾,则无效果 |
请输入对应命令最后得到的英文字母字符串。
输入#
存在多个样例,每行一个字符串,字符串只包含命令字符,长度不超过500。
输出#
依次输出每个样例的结果,为一个行字符串。
样例输入#
ab[c ab[c]-def<<+>g
样例输出#
cab cadfg
解析#
手动写了个链表,有亿点丑
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct list{
char a;
struct list *up;
struct list *down;
}list;
char str[505];
int main()
{
list *head,*tail,*p,*p1,*p2,*p3;
int i,len;
//p指针用于创建,p1指针用于指向目前
while(scanf("%s",str)!=EOF){
p=(list*)malloc(sizeof(list));
head=p;
tail=p;
p->up=NULL;
tail->down=NULL;
p1=head;
len=strlen(str);
for(i=0;i<len;i++){
if(str[i]=='['){
p1=head;
}else if(str[i]==']'){
p1=tail;
}else if(str[i]=='<'){
//想左移动
if(p1!=head){
p1=p1->up;
}
}else if(str[i]=='>'){
if(p1!=tail){
p1=p1->down;
}
}else if(str[i]=='-'){
if(p1!=head){
if(p1==tail){
p2=p1->up;
p1=p2;
tail=p2;
tail->down=NULL;
}else{
p2=p1->down;
p3=p1->up;
p1=p3;
p3->down=p2;
p2->up=p3;
}
}
}else if(str[i]=='+'){
if(p1!=tail){
p2=p1->down;
if(p2->down==NULL){
tail=p1;
tail->down=NULL;
}else{
p3=p2->down;
p1->down=p3;
p3->up=p1;
}
}
}else{
p=(list*)malloc(sizeof(list));
if(p1==tail){
p1->down=p;
p->up=p1;
p->a=str[i];
tail=p;
p->down=NULL;
p1=tail;
}else{
p->a=str[i];
p2=p1->down;
p->up=p1;
p->down=p2;
p1->down=p;
p2->up=p;
p1=p;
}
}
}
p=head->down;
while(p!=NULL){
printf("%c",p->a);
p=p->down;
}
printf("\n");
}
return 0;
}