BUAA_数据结构_4TH_文本编辑操作模拟(简)a

BUAA_数据结构_4TH_文本编辑操作模拟(简)a

题目描述:

编写一程序模拟文本编辑操作。首先从标准输入读取一行字符串(字符个数不超过512),该行字符串是已经过n(大于0,小于等于10)步编辑操作后的结果。然后从下一行读取n,以及已发生过的n步编辑操作,编辑操作分行输入,输入格式为:
op pos str
其中op为编辑操作命令编码(在此只有插入和删除操作,1表示插入或2表示删除操作);pos表示插入或删除的位置;str表示已经插入或删除的字符串(中间没有空格)。各数据间以一个空格分隔。
然后在空一行后,再分行输入当前将要进行的编辑操作,包括如下四种操作(操作编码分别为:1表示插入,2表示删除操作,3表示撤销(即undo操作),-1表示结束):
1 pos str
表示将在pos位置插入字符串str(中间没有空格),各数据间以一个空格分隔;
2 pos n
表示将从pos位置开始删除n个字符(各数据间以一个空格分隔),若要删除的字符个数多于已有字符个数(即在文本中从pos开始的字符个数小于n),则按实际字符数删除即可。(提示:为了能够撤销删除操作,应按“2 pos str”形式保存命令。)
3
表示撤销最近执行的插入或删除操作,可以进行多次撤销操作,注意:也可以撤销之前已经发生过的n步编辑操作中的操作。
-1
表示退出编辑操作,在屏幕上输出最终编辑后的文本。
要求:
1、上述所有输入的编辑操作中的字符串str都不包含空白字符(空格符、制表符或换行符);
2、插入操作中的位置pos大于等于0,并且小于等于当前文本的字符个数;0位置表示文本第一个字符的位置;若pos为当前文本的字符个数,则表示在文本最后插入字符串;
3、删除操作中的位置pos大于等于0,并且小于当前文字的字符个数;
4、若已无操作可撤销,则再进行撤销操作无效;
5、文本在编辑过程中,总字符个数不会超过512。

输入形式

先从键盘输入一行字符串,表示已经经过n步编辑操作后的文本串,然后在下一行输入一个正整数n,并分行输入n步插入或删除操作(表示按时间先后顺序已进行的操作),格式如上所述。随后空一行,再分行输入将要进行的编辑操作,格式如上所述。直到输入-1操作为止。

输出形式

在屏幕上输出最终编辑后的文本内容。

参考代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define maxN 520
struct edit{
    int op;
    int pos;
    char str[maxN+10];
    int num;
};
typedef struct edit edit;
edit stack[maxN+10];
int top;
char s[maxN+10];
char str_temp[maxN+10];

void init_stack();
int is_empty();
void push_back(edit temp);
edit pop();

void insert(int pos,char tmp[],int num);
void del(int pos, int num);

int main()
{
    init_stack();
    gets(s);
    int n,op_temp;
    edit temp;
    scanf("%d",&n);
    while(n--){
        scanf("%d %d %s",&temp.op,&temp.pos,temp.str);
        temp.num=strlen(temp.str);
        push_back(temp);
    }
    while(1){
        scanf("%d",&op_temp);
        if(op_temp==-1) break;
        if(op_temp==1){
            scanf("%d %s",&temp.pos,temp.str);
            temp.op=1;
            temp.num=strlen(temp.str);
            push_back(temp);
            insert(temp.pos,temp.str,temp.num);
        }
        else if(op_temp==2){
            scanf("%d %d",&temp.pos,&temp.num);
            temp.op=2;
            push_back(temp);
            int len=strlen(s);
            for(int i=stack[top].pos;i<len&&i<stack[top].pos+stack[top].num;i++){
                stack[top].str[i-stack[top].pos]=s[i];
            }
            del(temp.pos,temp.num);
        }
        else if(op_temp==3){
            if(is_empty()){
                continue;
            }
            temp=pop();
            if(temp.op==1){
                del(temp.pos,temp.num);
            }
            else if(temp.op==2){
                insert(temp.pos,temp.str,temp.num);
            }
        }
    }
    printf("%s\n",s);
    return 0;
}

void init_stack()
{
    top=-1;
}

int is_empty()
{
    if(top==-1) return 1;
    else return 0;
}

void push_back(edit temp)
{
    stack[++top]=temp;
}

edit pop()
{
    edit res=stack[top--];
    return res;
}

void insert(int pos,char tmp[],int num)
{
    char s_temp[maxN+10];
    strcpy(s_temp,s+pos);
    strcpy(s+pos,tmp);
    strcpy(s+pos+num,s_temp);
}

void del(int pos, int num)
{
    char s_temp[maxN+10];
    int len=strlen(s);
    if(num+pos>len) num = len - pos;
    strcpy(s_temp,s+pos+num);
    strcpy(s+pos,s_temp);
    s[len-num]='\0';
}

有问题或bug 欢迎私戳/评论

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值