算法3-2:行编辑程序 (c语言)

: 算法3-2:行编辑程序

时间限制:1 Seconds 内存限制:32 Mbyte
总提交:65 正确:9 作者:外部导入
[提交] [统计] [提问]

题目描述

  一个简单的行编辑程序的功能是:接收用户从终端输入的程序或数据,并存入用户的数据区。由于用户在终端上进行输入时,不能保证不出差错,因此,若在编辑程序中,“每接收一个字符即存入用户数据区”的做法显然不是很恰当。较好的做法是,设立一个输入缓冲区,用以接收用户输入的一行字符,然后逐行存入用户数据区。允许用户输入出差错,并在发现有误时可以及时更正。例如,当用户发现刚刚键入的一个字符是错的时,可补进一个退格符“#”,以表示前一个字符无效;如果发现当前键入的行内错误较多或难以补救,则可以键入一个退行符“@”,以表示当前行中的字符均无效。例如假设从终端接收了这样的两行字符:

whil##ilr#e(s#*s)
outcha@ putchar(*s=#++);
则实际有效的是下列两行:
while(*s)
putchar(*s++);

  为此,可设这个输入缓冲区为一个栈结构,每当从终端接收了一个字符之后先作如下判别:如果它不是退格符也不是退行符,则将该字符压入栈顶;如果是一个退格符,则从栈顶删去一个字符;如果它是一个退行符,则将字符栈清为空栈。上述处理过程可用下面算法描述之: 

图:行编辑程序算法

输入描述

若干行程序或者数据,每行不超过200个字符。

输出描述

经过行编辑程序处理过后的输出。

输入样例
whil##ilr#e(s#*s)
outcha@ putchar(*s=#++);

输出样例
while(*s)
putchar(*s++);

#include<stdio.h>
#include<string.h>

typedef struct Stack  //模拟栈
{
    char s[305];
    int top;  //栈顶
    int base;  //栈底
}STACK, *Stack;

void Init(Stack S)  //栈的初始化
{
    S->top = 0;
    S->base = 0;
}

void Pop(Stack S, char *e)  //出栈操作
{
    (*e) = S->s[--S->top];
}

void Push(Stack S, char c)  //入栈操作
{
    S->s[S->top++] = c;
}

int main()
{
    STACK S;
    char e;
    int i, j, h;
    char a[205];
    while(gets(a) != NULL)
    {
        h = strlen(a);
        Init(&S);
        for(i = 0; i < h; i++)
        {
            if(a[i] == '#')
            {
                Pop(&S, &e);
            }
            else if(a[i] == '@')
            {
                Init(&S);
            }
            else
            {
                Push(&S, a[i]);
            }
        }
        while(S.base != S.top)
        {
            printf("%c", S.s[S.base++]);
        }
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42819248/article/details/83153318
今日推荐