实验三 栈应用 实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
行编辑程序实验报告
一、实验内容和目的
实验目的:掌握栈的储存结构及其描述
掌握栈的建立、插入和删除操作
实验内容:1. 栈的建立
2. 入栈和出栈操作
3. 清空栈操作
二、实验原理
利用栈的特性(后进先出),把用户输入的字符储存到栈中,并通过事先规定好的字符(如’#’,’@’)对栈中的数据进行操作,实现行编辑器的功能。
当用户输入的不是事先约定的控制符,则把该字符进行入栈操作;
当用户输入的是约定的退格符(本实验中的退格符为’#’),把栈顶元素出栈,从而实现删除字符的操作;
当用户输入的是约定的退行符(本实验中的退格符为’@’),则清空栈,实现整行删除的功能。
当用户按下回车(即输入换行符’\n’时),即表明用户输入完毕,然后依次把栈中元素从栈底到栈顶输出。
三、程序流程图
四、实验结果
4.1 程序的主界面
4.2 输入whli##ilr#e(s#*s) 以后
五、操作说明
本程序处理范围仅限于一行字符,回车即表示全部字符输入结束。
程序运行以后,程序出于等待输入的状态(程序会提示“请在下面输入内容”),输入您要编辑的内容。
按回车输入结束
在输入期间,如果要退格,请在英文输入法状态下输入符号’#’,如果要清空整行的所有字符,同样地,请在英文输入法状态下输入符号’@’,会清空前面输入所有的字符。
所有的字符输入完成以后,按下回车键。
程序会处理所有的数据,并将处理以后所有的有效数据进行输出。
六、附录:代码
#include<stdio.h>
#include<stdlib.h>
#define MAX_STACK_SIZE 200
#define OK 0
#define MALLOC_FAIL 1
// 表示栈上溢
#define OVERFLOW 1
// 表示栈下溢
#define UNDERFLOW -1
typedef char SElemType;
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
} SqStack;
/* 栈基本功能的实现*/
// 栈的初始化
// 如果初始化成功,返回OK;如果不成功,返回MALLOC_FAIL
int Stack_Init(SqStack *stack)
{
// 为栈分配空间
stack->base = (SElemType *)malloc(MAX_STACK_SIZE * sizeof(SElemType));
// 如果不能分配到空间:返回错误信息
if (!stack->base)
return MALLOC_FAIL;
stack->top = stack->base;
stack->stacksize = 0;
// 初始化成功,返回成功信息
return OK;
}
// 清空栈
void Stack_Clear(SqStack *stack)
{
stack->top = stack->base;
stack->stacksize = 0;
}
// 把元素e 插入到栈stack 里面
// 如果栈已满,返回OVERFLOW
// 元素成功存入栈,返回OK
int Stack_Push(SqStack *stack, SElemType e)
{
// 如果栈已满,返回错误信息
if (stack->stacksize == MAX_STACK_SIZE)
return OVERFLOW;
// 把元素储存到栈里面,top 指针移动,计数加一
*(stack->top++) = e;
stack->stacksize++;
return OK;
}
// 把栈顶元素赋值给e,再在栈里删除栈顶元素
// 如果栈已空,返回UNDERFLOW
// 如果元素成功出栈,返回OK
int Stack_Pop(SqStack *stack, SElemType *e)
{
// 如果栈已空,返回错误信息
if (stack->stacksize == 0)
return UNDERFLOW;
// 把栈顶元素储存到e 中,然后top 指针下移
*e = *(--stack->top);
stack->stacksize--;
return OK;
}
/* 程序功能的实现*/
int main()
{
SqStack *stack = (SqStack *)malloc(sizeof(SqStack));
SElemType e, tmp;
int i;
// 如果栈空间分配失败,退出程序
if (!stack)
{
printf("分配栈空间发生错误\n");
system("pause");
exit(0);
}
// 如果栈初始化失败,退出程序
if (Stack_Init(stack) != OK)
{
printf("栈初始化发生错误\n");
system("pause");
exit(0);
}
printf("输入错误时,可以输入'#' 删除前一个字符,输入'@' 则把整行内容清除\n按回车表示输入结束\n");
printf("\n请在下面输入内容:\n");
// 从键盘读入一个字符,如果不是换行符,进行循环
while ((e = getchar()) != '\n')
{
if (e == '#')
{
Stack_Pop(stack, &tmp);
printf("\b");
}
else if (e == '@')
Stack_Clear(stack);
else
// 如果栈满,输出提示信息,并停止读入字符
if (Stack_Push(stack, e) == OVERFLOW)
{
printf("栈已满!\n");
break;
}
}
printf("\n输入的有效内容为:\n");
// 将栈中的所有元素从栈底开始输出
for (i = 0; i < stack->stacksize; i++)
putchar(stack->base[i]);
printf("\n\n");
system("pause");
return 0;
}。