HNCU 1741: 算法3-2:行编辑程序
来源:互联网 发布:淘宝什么数据库 编辑:程序博客网 时间:2024/06/18 12:49
题目描述
一个简单的行编辑程序的功能是:接收用户从终端输入的程序或数据,并存入用户的数据区。由于用户在终端上进行输入时,不能保证不出差错,因此,若在编辑程序中,“每接收一个字符即存入用户数据区”的做法显然不是很恰当。较好的做法是,设立一个输入缓冲区,用以接收用户输入的一行字符,然后逐行存入用户数据区。允许用户输入出差错,并在发现有误时可以及时更正。例如,当用户发现刚刚键入的一个字符是错的时,可补进一个退格符“#”,以表示前一个字符无效;如果发现当前键入的行内错误较多或难以补救,则可以键入一个退行符“@”,以表示当前行中的字符均无效。例如假设从终端接收了这样的两行字符:
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 10typedef 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; }
- HNCU 1741: 算法3-2:行编辑程序
- HNCU 1330: 算法3-1:八进制数
- HNCU1741:算法3-2:行编辑程序
- HNCU 1746: 算法4-1,4-3:定位子串
- HNCU 1328: 算法2-18~2-19:双向循环链表
- 数据结构 P50 算法实现 栈的应用-行编辑程序
- 行编辑程序实现
- 8587 行编辑程序
- 栈&&行编辑程序
- 行编辑程序
- 行编辑程序
- 行编辑程序
- 栈 行编辑程序
- 行编辑程序实现
- 行编辑程序
- 栈---行编辑程序
- 行编辑程序
- ACM-行编辑程序
- windows live writer的安装和使用
- ElasticSearch 5.1 基础概念及配置文件详解
- 解决vsftpd上传文件成功后使用url访问的550错误问题
- Jenkins + SVN + Cocoapods 实现iOS自动化打包
- 非Boot节点Eureka服务单向调用,环境隔离
- HNCU 1741: 算法3-2:行编辑程序
- 详解c++中类的六个默认的成员函数
- iOS 转让APP,变更开发商名字 —— HERO博客
- Android多线程
- 802.11无线网络学习(三):802.11 MAC基础
- Android之MappedByteBuffer缓冲用法
- 5-3 A-B (20分)
- java实现在线预览---poi操作ppt转html及03、07版本兼容问题
- MAC安装Securecrt破解