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

类似于线性表里面顺序表,顺序栈,自己样例试了都没有错,只不过提交显示是话唠,不是很懂这个OJ。。

#include<stdio.h>
#include<stdlib.h>#define OK 1
#define ERROR 0
#define OVERFLOW 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int SElemtype;
typedef int Status;typedef struct {SElemtype *base;SElemtype *top;int stacksize;
}SqStack;Status InitStack(SqStack *p)//初始化栈
{p->base = (SElemtype*)malloc(STACK_INIT_SIZE*sizeof(SElemtype));if(!p->base )exit(OVERFLOW);p->top = p->base ;p->stacksize = STACK_INIT_SIZE;return OK;
}Status ClearStack(SqStack *q)//清空栈
{if(q->base == q->top )return ERROR;q->top = q->base  ;return OK;
}Status Pop(SqStack *q,char *ch)//出栈
{if(q->base == q->top )return ERROR;*ch = *--(q->top);return OK;
}Status Push(SqStack *q,char *ch)//入栈
{SElemtype  *newbase;if((q->top -q->base ) >= q->stacksize ){newbase = (SElemtype*)realloc(q->base,(q->stacksize +STACKINCREMENT)*sizeof(SElemtype));if(!newbase)exit(OVERFLOW);q->base = newbase;q->stacksize  += STACKINCREMENT;}*(q->top) ++ = *ch;return OK;
}
Status StackEmpty(SqStack *q)//判断是否为空
{if( q->base == q->top )return OK;return ERROR;
}Status DestroyStack(SqStack *q)
{q->base = NULL;return OK;
}
void LineEdit()
{//利用字符栈s,从终端接收一行并传送至调用过程的数据区 SqStack p;SElemtype *s;char ch;InitStack(&p);//构造空栈 ch = getchar();//从终端接收第一个字符 while(ch!=EOF)//EOF为全文结束符 {while(ch!=EOF&&ch!='\n'){switch(ch){case '#':Pop(&p,&ch);break;//仅当栈非空时退栈 case '@':ClearStack(&p);break;//重置p为空栈 default :Push(&p,&ch);break;//有效字符进栈,未考虑栈满的情形 }ch = getchar();//从终端接收下一个字符 }s = p.base ;while(s != p.top ){ch = *s;putchar(*s);s++;}printf("\n");//将从栈底到栈顶的栈内字符传送至调用过程的数据区 ClearStack(&p);if(ch!=EOF)getchar();//读取下一行的第一个字符 }DestroyStack(&p);
}
int main()
{LineEdit();return 0;} 

转载于:https://www.cnblogs.com/hellocheng/p/7350136.html

HNCU 1741: 算法3-2:行编辑程序相关推荐

  1. 数据结构课程设计—简单行编辑程序

    简单行编辑程序 一.引言 1.1 问题的提出 文本编辑程序是利用计算机进行文字加工的基本软件工具,实现对文本文件的插入.删除等修改操作.限制这些操作以行为单位进行的编辑程序称为行编辑程序. 被编辑的文 ...

  2. 初学者指南:什么是算法?11行伪代码给你讲明白

    导读:本文带你熟悉一个重要的术语--算法. 作者:帕诺斯·卢里达斯(Panos Louridas) 来源:大数据DT(ID:hzdashuju) 算法(algorithm)就是一个过程,是一种特殊的过 ...

  3. 在Matlab实现Kmeans算法(每行代码带注释)

    目录 一.前言 二.VQ概述 三.Kmeans算法 K-means 的算法步骤为: 四.Matlab代码实现过程 五. 一点点可选改动(个人看法) 参考链接: 一.前言 本人对机器学习.人工智能算法方 ...

  4. HNCU 1328: 算法2-18~2-19:双向循环链表

    <数据结构> 2.3 循环链表 http://hncu.acmclub.com/index.php?app=problem_title&id=111&problem_id= ...

  5. Matlab实现Kmeans算法(每行代码标注详细注解)

    本文主要为了完成平日作业,并进一步加深对算法的理解.也希望对来访的读者有所帮助. 目录 一.什么是Kmeans算法 二.Kmeans算法的意义 三.Kmeans算法代码解析 1.关键概念 2.大致思路 ...

  6. Matlab实现DBSCAN算法(每行代码标注详细注解)

    本文主要为了完成平日作业,并进一步加深对算法的理解.也希望对来访的读者有所帮助. 目录 一.什么是DBSCAN算法 二.DBSCAN算法的意义 三.DBSCAN算法代码解析 1.关键概念 2.大致思路 ...

  7. HNCU 1746: 算法4-1,4-3:定位子串

    题目描述 将子串在母串中第一次出现的位置找出来. 图1:在母串中第pos个位置定位子串的算法 图2:从母串中第pos个位置获得长度为len的子串 输入 若干对字符串,每对字符串占一行并用一个空格分开. ...

  8. C语言实用算法系列之行指针

    代码 #include <stdio.h>void Test(double (*a)[3]) {printf("sizeof(a)=%d\n", sizeof(a)); ...

  9. QQ密码算法 用于命令行登录

    以下启动QQ调用 QQ.exe /START QQUIN:[QQ号] [算出的密码]  /STAT:[是否隐身] 隐身/不隐身: 40/41 例:D:\Program Files\Tencent\QQ ...

最新文章

  1. HLS中m3u8格式规范解读
  2. netty websocket客户端_Websocket操作字节序 之 服务端
  3. Java打印菱形(空格菱形)(星星之间有空格)
  4. 读书笔记九:TCP/IP详解之广播和多播,IGMP协议
  5. IOS15最标准的纯代码搭建项目
  6. pip安装mysql模块_使用pip安装mysql模块for python
  7. 水晶报表如何查看sql_有了这个报表工具,一键生成自定义的各种报表,还可以导出Excel...
  8. CSS——CSS创建样式表
  9. CSS基础必备知识点05
  10. Java基础(七)——文件、IO流
  11. 你真的理解机器学习中偏差 - 方差之间的权衡吗?
  12. elasticsearch sql插件 2.4及以下版本配置
  13. NodeJS运行时抛出: Error: listen EADDRINUSE :::3000
  14. springboot文件上传大小限制:The field file exceeds its maximum permitted size of 1048576 bytes
  15. solidworks电气元件3d库_丨部件库丨西门子3RV6电机保护开关
  16. MySQL从删库到跑路: 入门篇
  17. 推荐四个在线任务管理网站
  18. psd 将分组合并导出png图片
  19. 保驾护航政务企业上云,云上安全一马当先
  20. php导出复杂表头excel,js导出复杂表头(多级表头)的excel

热门文章

  1. Java 正青春:现状与技术趋势报告
  2. Chrome浏览器手动添加Cookie的方法
  3. ubuntu安装postman
  4. jsp的内置对象有哪些
  5. 常见Java面试题 BIO、NIO、AIO 有什么区别?
  6. 有不同列数的两个表的UNION
  7. Oracle数据块原理深入剖析
  8. 平切分,分库,分表,主从,集群 数据库水平切分的实现原理解析
  9. 应届生程序员,业务和技术孰轻孰重,如何找到适合自己的方向
  10. eNSP中玩转Python自动化——解锁网工新姿势