行编辑程序 实验报告
一、 实验内容和目的
实验目的:掌握栈的储存结构及其描述
掌握栈的建立、插入和删除操作
实验内容: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 {
/* 栈基本功能的实现*/
// 栈的初始化
// 如果初始化成功,返回OK;如果不成功,返回MALLOC_FAIL int Stack_Init(SqStack *stack)
{
}
// 清空栈
void Stack_Clear(SqStack *stack)
{
}
// 把元素e 插入到栈stack 里面
// 如果栈已满,返回OVERFLOW
// 元素成功存入栈,返回OK
int Stack_Push(SqStack *stack, SElemType e) {
// 如果栈已满,返回错误信息 if (stack->stacksize == MAX_STACK_SIZE) return OVERFLOW; stack->top = stack->base; stack->stacksize = 0; // 初始化成功,返回成功信息 return OK; stack->top = stack->base; stack->stacksize = 0; // 如果不能分配到空间:返回错误信息 if (!stack->base) return MALLOC_FAIL; // 为栈分配空间 stack->base = (SElemType *)malloc(MAX_STACK_SIZE * sizeof(SElemType)); SElemType *base; SElemType *top; int stacksize; } SqStack;
}
// 把元素储存到栈里面,top 指针移动,计数加一 *(stack->top++) = e; stack->stacksize++; return OK;
// 把栈顶元素赋值给e,再在栈里删除栈顶元素 // 如果栈已空,返回UNDERFLOW
// 如果元素成功出栈,返回OK
int Stack_Pop(SqStack *stack, SElemType *e) {
}
/* 程序功能的实现*/
int main()
{
// 如果栈初始化失败,退出程序 if (Stack_Init(stack) != OK) { printf("栈初始化发生错误\n"); system("pause"); // 如果栈空间分配失败,退出程序 if (!stack) { } printf("分配栈空间发生错误\n"); system("pause"); exit(0); SqStack *stack = (SqStack *)malloc(sizeof(SqStack)); SElemType e, tmp; int i; return OK; // 把栈顶元素储存到e 中,然后top 指针下移 *e = *(--stack->top); stack->stacksize--; // 如果栈已空,返回错误信息 if (stack->stacksize == 0) return UNDERFLOW;
} } exit(0); printf("输入错误时,可以输入'#' 删除前一个字符,输入'@' 则把整行内容清除\n按回车表示输printf("\n请在下面输入内容:\n"); // 从键盘读入一个字符,如果不是换行符,进行循环 while ((e = getchar()) != '\n') { } printf("\n输入的有效内容为:\n"); // 将栈中的所有元素从栈底开始输出 for (i = 0; i < stack->stacksize; i++) putchar(stack->base[i]); if (e == '#') { } else if (e == '@') Stack_Clear(stack); // 如果栈满,输出提示信息,并停止读入字符 if (Stack_Push(stack, e) == OVERFLOW) { } printf("栈已满!\n"); break; else Stack_Pop(stack, &tmp); printf("\b"); 入结束\n"); printf("\n\n"); system("pause"); return 0;