【数据结构入门训练DAY-12】行编辑程序

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、题目
  • 二、解题思路
  • 总结

前言

本次数据结构入门训练主要训练到以下内容:

  1. 复习了栈的入栈和出栈操作
  2. 训练解题思维

一、题目

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

二、解题思路

           今天的题目我觉得是昨天括号匹配问题的plus版;它题目中写到'@'是退行,'#'是退格,这个东西和计算机的删除字符和删除选定行类似的思路,执行一下'#'就是删除'#'前面的一个字符,然后执行'@'就是删除'@'前的一行字符串;其他的按序压出栈。搞清楚这个就够了,我们开始写代码,与昨天不同的是,今天在结构体中就建立了字符串。代码如下:

#include 
using namespace std;
typedef char SElemType;
const int Max = 100000;
struct SqStack {//创建栈的结构
    SElemType data[Max];
    int top;//栈顶指针
};
void InitStack(SqStack &S) {//定义新的栈
    S.top = 0;
}
bool Push(SqStack &S, SElemType e) {//入栈操作
    if (S.top >= Max) {
        return false;
    }
    S.data[S.top++] = e;
    return true;
}
bool Pop(SqStack &S, SElemType &e) {//出栈操作
    if (S.top <= 0) {
        return false;
    }
    e = S.data[--S.top];
    return true;
}
void SqStackEmpty(SqStack &S) {//栈空
    S.top = 0;
}
void LineEdit() {//主逻辑代码
    SqStack S;
    InitStack(S);
    int ch;
    while ((ch = getchar()) != EOF) {
        while (ch != EOF && ch != '\n') {
            switch (ch) {
                case '#': {
                    SElemType temp;
                    Pop(S, temp);
                    break;
                }
                case '@':
                    SqStackEmpty(S);
                break;
                default:
                    Push(S, ch);
                break;
            }
            ch = getchar();
        }
        for (int i = 0; i < S.top; ++i)
            putchar(S.data[i]);
        putchar('\n');
        SqStackEmpty(S);
    }
}
int main() {
    LineEdit();
    return 0;
}

        使用getchar()最好就都和putchar()一起用,它俩“分手”可能会把你的东西干出“输出超限”。


总结

        今天唯一卡的地方就是getchar()和putchar()的地方,当时一直超限,因为自己的迷之自信,觉得C++就可以随心所欲,然后结果可想而知,直接全部输出超限。后续要遵守代码逻辑规则,不可胡作非为!!!

你可能感兴趣的:(数据结构入门训练,数据结构)