数据结构行编辑程序报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SqStack S,S1;
InitStack(S);
InitStack(S1);
char ch,c;
ch=getchar();
while(ch!=EOF){//EOF为全文结束符
while(ch!=EOF&&ch!='\n'){
switch(ch){
case'#':Pop(S,c); break;//仅当栈非空时退栈
二.设计
用栈编辑一个输入缓冲区
1.用“#”符号删除前一个错误的字符,用Pop退出栈顶元素已删除最后一个错误元素。
2.用“@”符号删除前面一行元素,循环使用判断前是否还有元素,如有用Pop删除。直至判断栈空为止。实现退行功能。
此程序很恰当的运用了栈后进先出的特点,将栈定义,在算法中直接调用,帮助实现“#”符号的退格功能和“@”符号的退行功能。
}
Status GetTop(SqStack S,SElemType &e)
{//取栈顶元素
if(S.top==S.base) return ERROR;
e=*(S.top-1);
return OK;
}//GetTop
Status Push(SqStack &S,SElemType e)
{//入栈将e放入栈里面
case'@':{
while(!StackEmpty(S))
Pop(S,c);
};break;//构造空栈S
default:Push(S,ch); break;//有效字符进栈,未考虑栈满情形
}
ch=getchar();//从终端接收下一字符
}
while(!StackEmpty(S)){
Pop(S,c);
Push(S1,c);
}
while(!StackEmpty(S1)){
Pop(S1,c);
printf("%c",c);
}
ClearStack(S);//重置S为空栈
if(ch!=EOF) ch=getchar();
}
DestoryStack(S);
}
void main()
{
LineEdit();
}
【实验方案设计与实验过程】(分析、设计、实验步骤、测试数据、实验结果)
一.分析
一个简单的行编辑程序的功能是:接受用户从终端输入的程序或数据,并存入用户的数据区。由于输入过程中不保证不出差错,因此较好的做法是,设立一个输入缓冲区,用以接受用户输入的一行字符,,然后逐行存入用户数据区。允许用户输入出差错,并在发现有失误时可以及时更正。例如,当用户发现刚刚键入的一个字符是错的时,可补进一个退格符“#”,以表示前一个字符无效;如果发现当前键入的行内差错较多或难以补救,则可以键入一个退行符“@”,以表示当前行中的字符均无效。
ClearStack(SqStack &S);
}SqStack;
Status InitStack(SqStack &S);
void DestoryStack(SqStack &S);
void ClearStack(SqStack &S);//栈的清空
int StackLength(SqStack S);
三、实验步骤
1.先定义本实验中用到的栈的ADT表示为:
ADT Stack{
数据对象:D={ai|ai为字符,i=1,2,…n,n>=0 }
数据关系:R={<ai-1,ai> |ai-1,ai∈D,i=2,…,n}
基本操作:
InitStack(&S)构造一个空栈
DestroyStack(&S)销毁栈
Push(&S,e)元素e入栈
Status GetTop(SqStack S,SElemType &e);
Status StackEmpty(SqStack S);
Status Push(SqStack &S,SElemType e);
Status Pop(SqStack &S,SElemType &e);
3.基本算法操作描述
#include <stdio.h>
四、测试数据
输入:whli##ilr#e(s#*s)
outcha@putchar(*s=#++);
结果:while(*s)
putchar(*s++);
【实验小结】(实验过程中出现的问题、结果分析、出错原因分析等)
本次实验是栈的活用,在实验中出现了许多的问题,在共同解决了所有问题后,运行不出结果。经老师指点,我们从书中抄了一段结果,却输出一堆数字,后来发现输出方式错了,改正后却又有了新的问题,输入与输出是反的,老师然我们又做了一个空栈,将接过输入孔战后在输出将顺序调转过来。终于输出了结果。但还是一场空欢喜,“#”符号功能实现了,可“@”没能实现。
计算机系
上机实验报告
实验项目名称行编辑
所属课程名称数据结构
实验类型综合型实验
班级
完整学号
姓名
成绩
实验概述:
【实验目的】
1.练习ADT数据类型的描述并写出栈的逻辑结构表示
2.掌握栈的特点并实现栈的存储表示
3.用栈解决行编辑的问题
【实验环境】(使用的软件)
Visual C++ 6.0控制台编程环境
实验内容(不够附页):
if(S.top-S.base>=S.stacksize) //栈满
return ERROR;
*S.top++=e;
return OK;
}//Push
Status Pop(SqStack &S,SElemType &e)
{//出栈栈顶元素放入e里面并删除
if(S.top==S.base) return ERROR;
{ S.stacksize=0;
}
Status StackEmpty(SqStack S)//判断栈是否为空
{ if(S.top==S.base) return 1;
else return 0;
}
int StackLength(SqStack S){//栈的长度求栈里有多少个元素
return S.top-S.base;
e=*--S.top;
return OK;
}//Pop
4.行编辑算法的实现程序:
#include <stdio.h>
#include <stdlib.h>
#include "myr.h"
//Status StackTraverse(SqStack S,Status(*visit()));
void LineEdit(){//利用字符栈S,从终端接收一行并传送至调用过程的数据区。
Pop(&S,e)栈顶元素出栈,ቤተ መጻሕፍቲ ባይዱe返回其值
ClearStack(&S);栈的清空
StackLength(S);栈的长度
GetTop(S,&e);取栈顶元素
StackEmpty(S)判断栈是否为空
2.栈表示:
#define STACK_INIT_SIZE 100
#define OVERFLOW 0
#define OK 1;
老师让我们用判断语句实现栈的清空,于是我变了如下程序:
case'@':{
while(!StackEmpty(S))
Pop(S,c);
}
可结果没能删除整行字符只删了一个,没能实现循环。尝试了许多方法都有错误。无意中在最后加了一个分号居然就实现了循环,无解。
总之,实现了行编辑的功能让我很有成就感,对迷宫求解也就跃跃欲试了。
#define ERROR 0;
typedef int Status;
typedef char SElemType;
typedef struct SqStack{//栈定义
SElemType *base;
SElemType *top;
int stacksize;
DestoryStack(SqStack &S);
S.top=S.base;//初始状态
S.stacksize= STACK_INIT_SIZE ;
return OK;
}//InitStack
void DestoryStack(SqStack &S)
{//栈的销毁
free(S.base);
S.stacksize=0;
}
void ClearStack(SqStack &S)//栈的清空
#include <stdlib.h>
#include "myr.h"
Status InitStack(SqStack &S)
{//初始化栈
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));//申请空间
if (!S.base) exit(OVERFLOW);
成绩:
批阅日期:
相关文档
最新文档