题目描述

一个简单的行编辑程序的功能是:接受用户从终端输入的程序或数据,并存入用户的数据区。

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

输入

输入多行字符序列,行字符总数(包含退格符和退行符)不大于250。 

输出

按照上述说明得到的输出。 

示例输入

whli##ilr#e(s#*s)
outcha@putchar(*s=#++);

示例输出

while(*s)
putchar(*s++);

#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OK 1
#define OVERFLOW -1
#define ERROR  -2
typedef char SElemType;
typedef struct
{SElemType *base;//栈底指针SElemType *top;//栈顶指针int stacksize;//当前已分配的存储空间,以元素为单位
}SqStack;
void InitStack(SqStack &S)// 构造一个空栈S
{S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));if(!S.base) exit(OVERFLOW);//存储分配失败S.top=S.base;S.stacksize=STACK_INIT_SIZE;
}
void DestroyStack(SqStack &S)//销毁栈;
{S.top=NULL;
S.stacksize=0;
}
void ClearStack(SqStack &S)//清空栈;
{S.top=S.base;
}
void Push(SqStack &S,SElemType e)// 插入元素e为新的栈顶元素
{if(S.top-S.base>=S.stacksize){// 当前存储空间已满,增加分配S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));if(!S.base) exit(OVERFLOW);//存储分配失败S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;//增加存储容量}*S.top++=e;
}
int Pop(SqStack &S,SElemType &e)//若栈不空,则删除S的栈顶元素,并     //用e返回其值,并返回OK,否则返回//ERROR
{if(S.top==S.base) return ERROR;e=*--S.top;return OK;
}
int GetTop(SqStack S,SElemType &e)//若栈不空,则用e返回S的栈顶元素,并//返回OK,否则返回ERROR
{if(S.top==S.base) return ERROR;e=*(S.top-1);return OK;
}
void PutStack(SqStack &S)
{while(S.top>S.base){S.top--;printf("%d",*S.top);}printf("\n");
}
void LineEdit()//行编译函数;
{char ch,*temp;SqStack S;//栈的定义;InitStack(S);//栈的初始化;ch=getchar();while(ch!=EOF){while(ch!=EOF&&ch!='\n'){switch(ch){case '#':Pop(S,ch);break;//出栈操作;case '@':ClearStack(S);break;//清空栈;default :Push(S,ch);break;//进栈;}ch=getchar();}temp=S.base;//temp指针指向base指针;while(temp!=S.top){printf("%c",*temp);++temp;}ClearStack(S);//清空栈;printf("\n");if(ch!=EOF){ch=getchar();}
}DestroyStack(S);//销毁栈;
}
int main()
{LineEdit();return 0;
}

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
using namespace std;
#define maxsize 10000
typedef struct Stack
{int Size;char *top,*base;
} Stack;bool Empty(Stack &s)
{if (s.top == s.base){return 1;}return 0;
}void Creat(Stack &s)//栈的初始化;
{s.base=new char[maxsize];s.top=s.base;s.top++;s.base++;s.Size=maxsize;
}void push(Stack &s,char e)
{if (s.top-s.base >= s.Size){s.base=(char *)realloc(s.base,2*maxsize*sizeof(Stack));s.Size+=maxsize;///s.top=s.base+s.Size;}s.top++;*s.top=e;
}void pop(Stack &s)
{if (s.top != s.base){s.top--;}
}void print(Stack &s)
{while (!Empty(s)){cout<<*s.top;pop(s);}
}void out(Stack &s)//栈内元素的输出
{s.base++;while(s.base<=s.top){cout<<*s.base;s.base++;}cout<<endl;
}void Clear(Stack &s)
{while (!Empty(s)){pop(s);}
}void edit(Stack &s,char str[])
{int i;for(i=0; str[i]; i++){if (str[i] == '#' && !Empty(s)){pop(s);//出栈;}else if(str[i] == '@'){Clear(s);//清空栈;}else if (str[i]!='#'&&str[i]!='@'){push(s,str[i]);//进栈;}}
}
int main()
{char str[333];while(gets(str)!=NULL){Stack s;Creat(s);edit(s,str);out(s);}return 0;
}

数据结构实验之栈:行编辑器相关推荐

  1. sdut 1479 数据结构实验之栈与队列九:行编辑器

    数据结构实验之栈与队列九:行编辑器 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descript ...

  2. SDUT-2449_数据结构实验之栈与队列十:走迷宫

    数据结构实验之栈与队列十:走迷宫 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个由n * m 个格子组成的迷宫,起 ...

  3. sdut 3335 数据结构实验之栈与队列八:栈的基本操作

    数据结构实验之栈与队列八:栈的基本操作 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descri ...

  4. sdut 3333 数据结构实验之栈与队列六:下一较大值(二)

    数据结构实验之栈与队列六:下一较大值(二) Time Limit: 150MS Memory Limit: 8000KB Submit Statistic Discuss Problem Descri ...

  5. sdut-3332 数据结构实验之栈与队列五:下一较大值(一)

    数据结构实验之栈与队列五:下一较大值(一) Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Desc ...

  6. 2131数据结构实验之栈与队列一:进制转换

    数据结构实验之栈与队列一:进制转换 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入一个十进制非负整数,将其转换成对 ...

  7. sdut 2088 数据结构实验之栈与队列十一:refresh的停车场

    数据结构实验之栈与队列十一:refresh的停车场 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem ...

  8. sdut 2134 数据结构实验之栈与队列四:括号匹配

    数据结构实验之栈与队列四:括号匹配 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descript ...

  9. SDUT-2132_数据结构实验之栈与队列二:一般算术表达式转换成后缀式

    数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运 ...

  10. 数据结构实验之栈四:括号匹配

     数据结构实验之栈四:括号匹配 Description 给你一串字符,不超过50个字符,可能包括括号.数字.字母.标点符号.空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配. Inp ...

最新文章

  1. Hadoop通过路径和和链接访问HDFS
  2. 如何去maven仓库下载jar包
  3. webform 简单的服务器控件。
  4. 使用JAVASCRIPT实现弹出框,过一段时间自动消失
  5. 递归算法详解及测试效率
  6. java实验类与对象_【实验课件】上机实践2  类与对象
  7. “深入浅出”是什么导致不能以操作系统用户身份连接到数据库
  8. amd opencl使用低版本驱动
  9. 安装VS2008(转)
  10. 工作11年后一切归零
  11. 你的年龄体重身高,最好别对这款 app 撒谎
  12. 互联网服务器信息检索,网络信息检索的一般方法
  13. 如何解决:error: failed to push some refs to
  14. CentOs虚拟机硬盘扩容
  15. Android输入法window类型,android输入法windowSoftInputMode属性详解章
  16. TypeScript Property ‘XXX‘ does not exist on type ‘never‘.
  17. 输出魔方阵,所谓魔方阵是指这样的方阵,它的每一行,每一列和对角线之和均相等。例如,三阶魔方阵为
  18. ddn高性能服务器,DDN是什么,DDN专线的优势详解
  19. 2021年茶艺师(中级)报名考试及茶艺师(中级)复审考试
  20. Qt利用JavaScript访问网页元素(百度博客下载例子)

热门文章

  1. 技能的反面 - 魔方和模仿
  2. 顶级程序员的心得 Coders at Work (II)
  3. ssm后台数据是为什么是空值_网易后台开发实习生面试总结
  4. mysql 字段排重_MySQL 根据单个、多个字段排重
  5. 关于HTML的盒子的一些小问题
  6. 添加公共引用目录_原来Word还可以自动生成图片和图表目录!
  7. linux set权限,Linux 特殊权限set_uid(示例代码)
  8. mysql安装被打断_Mysql的安装/性能优化/安全加固
  9. java递归分苹果_递归较难题——分苹果问题
  10. div中的p标签于img设置同一水平_前端工程师:css中一些需要注意的东西