题面
小明正使用Microsoft Word打一篇文档,文档只包含a-z的小写字母和空格,在打字过程中可能会一次或多次按下Home键、End键、←方向键、→方向键、Insert键、Backspace键。请编写程序,给定小明在键盘上按键的序列,输出小明屏幕上最终显示的文本。
提示:Home键会将当前光标移至文本开始位置,End键当前光标移至文本尾,←键和→键会使当前光标左移或右移一个位置(如果光标在文档头则无法左移,光标在文档尾则无法右移),Insert键会在插入和替换文本间切换(默认是插入状态),Backspace键会删除当前光标前的一个字符。输入格式:
输入为不超过50000个字符,表示小明的按键序列。包含a-z的小写字母、空格以及字符[、]、{、}、-、=。其中字符“[”表示Home键,“]”表示End键,“{”表示←键,“}”表示→键,“-”表示Insert键,“=”表示Backspace键。
输出格式:
输出为在小明屏幕上最终显示的文本。最后一个字母后没有回车或换行。
输入样例1:
jilin[i lofe{{-v-} ] universiti=y
输出样例1:
i love jilin university
输入样例2:
abcd[c-de
输出样例2:
cdecd
输入样例3:
[[]][][]happy=birthday
输出样例3:
happbirthday
输入样例4:
efg[bbb}}=}}}}=[{{{{a
输出样例4:
abbbe
分析
链表基础操作应用,直接看代码。
代码
#include<stdio.h>
#include<stdlib.h>
struct Node{//定义双向链表结构体
char ch;
struct Node* left;
struct Node* right;
};
struct Node* replace(char,struct Node*);//替换函数
void insert(char,struct Node*);//插入函数
void delete(struct Node*);//删除函数
int main()
{
char c;
int sta=0;//插入状态标记
struct Node *head=(struct Node*)malloc(sizeof(struct Node));//分配头尾节点
struct Node *nail=(struct Node*)malloc(sizeof(struct Node));
struct Node *p=nail;//光标
head->left=NULL;
head->right=p;
nail->left=head;
nail->right=NULL;//初始化
while(scanf("%c",&c)!=EOF){//EOF=0,这里利用函数返回值确定结束
switch(c)
{
case '\n': break;
case '[': p=head->right;break;
case ']': p=nail;break;
case '{': if(p!=head->right) p=p->left;break;
case '}': if(p!=nail) p=p->right;break;
case '-': sta++;break;
case '=': if(p!=head) delete(p);break;
default:
if(sta%2==1&&p!=nail) p=replace(c,p);
else insert(c,p);
break;
}
}
p=head->right;
while(p!=nail){//输出与释放空间
printf("%c",p->ch);
p=p->right;
free(p->left);
}
free(head);
free(nail);
return 0;
}
struct Node* replace(char ch,struct Node* p){
p->ch=ch;
return p->right;//注意光标移动,要返回更新后的光标地址
}
void insert(char ch,struct Node* p){
struct Node* q=(struct Node*)malloc(sizeof(struct Node));
if(q==NULL) {//检查是否分配成功
printf("error");
return;
}
q->ch=ch;
q->left=p->left;
p->left->right=q;
q->right=p;
p->left=q;
return;
}
void delete(struct Node* p){
struct Node* q=p->left;
q->left->right=p;
p->left=q->left;
free(q);//释放空间
return;
}