数据结构-行编辑程序

一个简单的行编辑程序的功能是:接受用户从终端输入的程序或数据,并存入用户的数据区。由于用户在终端上进行输入时,
不能保证不出差错,因此,若在行编辑程序中“每接受一个字符即存入用户区”的做法显然是不恰当的。
较好的做法是,设立一个输入缓冲区,用以接收用户输入的一行字符,然后逐行存入用户数据区。允许用户输入出差错,
并在发现有误时及时改正。
例如:当用户发现刚刚建入的一个字符是错的时,可补进一个退格符“#”,以表示前一个字符无效;如果发现当前键入的行内
差错较多或难以补救,则可以输入一个退格符“@”,以表示当前行中的字符均无效。
例如,假设从终端接受了这两行字符:
whil##ilr#e(s#*s)
    [email protected](*s=#++)
则实际有效的是下列两行:
while(*s)
    putchar(*s++)

程序代码如下:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3
  4 #define STACK_INIT_SIZE 100
  5 #define STACKINCREMENT 10
  6 #define OVERFLOW -2
  7 #define OK 1
  8 #define ERROR 0
  9
 10 typedef char SElemType;
 11
 12 //栈结构体
 13 typedef struct {
 14     SElemType *base;
 15     SElemType *top;
 16     int stacksize;
 17 }SqStack;
 18
 19 int InitStack(SqStack *S);//初始化栈
 20 int Push(SqStack *S,SElemType e);//入栈
 21 int Pop(SqStack *S,SElemType *e);//删除栈中的元素
 22 int DestoryStack(SqStack *S);//销毁栈
 23 void LineEdit(SqStack *S);//行编辑程序
 24 int ClearStack(SqStack *S);//清空栈中的元素
 25
 26 //初始化栈
 27 int InitStack(SqStack *S) {
 28     S->base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
 29     if(!S->base) {
 30         exit(OVERFLOW);
 31     }
 32     S->top = S->base;
 33     S->stacksize = STACK_INIT_SIZE;
 34
 35     return OK;
 36 }
 37
 38 //入栈
 39 int Push(SqStack *S,SElemType e) {
 40     if((S->top-S->base)>=S->stacksize) {
 41         S->base = (SElemType*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(SElemType));
 42         if(!S->base) {
 43             exit(OVERFLOW);
 44         }
 45         S->top = S->base + S->stacksize;
 46         S->stacksize += STACKINCREMENT;
 47     }
 48     *S->top++ = e;
 49     //printf("%c\n",e);
 50     return OK;
 51 }
 52
 53 //删除栈中的元素
 54 int Pop(SqStack *S,SElemType *e) {
 55     if(S->top  == S->base) return ERROR;
 56     *e = *--S->top;
 57     return OK;
 58 }
 59
 60
 61 //清空栈中的元素
 62 int ClearStack(SqStack *S) {
 63     S->top = S->base;
 64     return OK;
 65 }
 66
 67 //销毁栈
 68 int DestoryStack(SqStack *S) {
 69     S->top = S->base;
 70     free(S->base);
 71     S->top = NULL;
 72     S->base = NULL;
 73     return OK;
 74 }
 75
 76 //行编辑程序
 77 void LineEdit(SqStack *S) {
 78     SElemType *p,ch,c;
 79     InitStack(S);
 80     ch = getchar();
 81     while(ch != EOF) {
 82         while(ch!=EOF&&ch!=‘\n‘) {
 83             switch(ch) {
 84                 case ‘#‘:Pop(S,&c);break;
 85                 case ‘@‘:ClearStack(S);break;
 86                 default:Push(S,ch);break;
 87             }
 88             ch = getchar();
 89         }
 90         p = S->base;
 91         while(p!=S->top) {
 92             printf("%c",*p);
 93             ++p;
 94         }
 95         ClearStack(S);
 96         if(ch!=EOF) ch = getchar();
 97     }
 98 }
 99
100 int main()
101 {
102     SqStack sq;
103     int f;
104     LineEdit(&sq);//进行括行编辑
105     DestoryStack(&sq);//将栈销毁
106     return 0;
107 }
时间: 2024-12-26 21:32:46

数据结构-行编辑程序的相关文章

C语言实现行编辑程序(严蔚敏老师数据结构3.2)

-------------------------------------------- /**************************************************//* 行编辑程序 *//* 输入的数据存入缓冲区用来接收用户输入的一行字符 *//* 之后逐行存入用户数据区 *//* 当用户输入出错时可以输入退格符 # 来表示前一个字符无效 *//* 输入@ 表示当前行中之前输入的字符无效 *//************************************

行编辑程序、括号匹配检验

行编辑程序.括号匹配检验程序都是利用的栈的数据结构.而这两个 小程序也非常好的显示了栈先进后出的思想.由于程序本身很简短.清晰,所 以也就不做多的解释了,直接上代码了. 行编辑程序: #include<iostream> #include<stack> using namespace std; int main() { stack<char> sta; char ch = getchar(); while(ch!=EOF) { while(ch!=EOF&&am

栈的应用之行编辑程序

Description 利用栈编写简单的行编辑程序:接受用户从终端输入的程序或数据,在输入过程中,允许用户输入出差错,并在发现有误时可以及时更正.例如:当用户发现刚刚键入的一个字符是错的时,可以补进一个退格符“#”,以表示前一个字符无效:如果发现当前键入的行内差错较多或难以补救,则可以键入一个退行符“@”,以表示当前行中的字符均无效.例如:假设从终端接受了这样两行字符: whli##ilr#e (s#*s) [email protected](*s=#++); 则实际有效的是下列两行: whil

行编辑程序

一个简单的行编辑程序的功能是:接受用户从终端输入的程序或数据,并存入用户的数据区.由于用户在终端进行输入时,不能保证不出差错,因此,若在编辑程序中,"每接受一个字符即存入用户数据区"的做法显然不是最恰当的.较好的做法是,设立一个输入缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区.允许用户输入出差错,并在发现有误时可以及时更正.例如,当用户发现刚刚键入的行内差错较多或难以补救,可以键入一个退行符"@",以表示当前行中的字符均无效.例如,假设从终端接受了这样

堆栈练习3—行编辑程序

输入文件 LineEditor.in 输出文件 LineEditor.out [题目描述]行编辑程序(LineEditor.c/cpp/pas) 为了保证用户的正确输入,上古文明遗迹入口提供了一个简单的行编辑程序,它的功能是:接收用户从终端输入的程序或数据,并存入用户的数据区.由于用户在终端上进行输入时,不能保证不出差错,因此若在编辑程序中,"每接收一个字符即存入用户数据区的做法"显然不是最恰当的.较好的做法是:设立一个输入缓冲区,用以接收用户输入的一行字符,然后逐行存入用户数据区.程

数据结构 栈的应用——行编辑程序

1 #include <stdio.h> 2 #include <malloc.h> 3 #include <stdlib.h> 4 #include <math.h> 5 6 #define STACK_INIT_SIZE 100 //存储空间åˆ?始分é…?é‡? 7 #define STACKINCREMENT 10 //存储空间分é…?å¢?é‡? 8 #define SElemType char //å½

【数据结构】栈的应用--行编辑程序(c++)

头文件: #pragma once #include <iostream> #include <assert.h> using namespace std; template<class Type> class SeqStack { public: SeqStack(size_t sz = INIT_SZ); ~SeqStack(); public: bool empty()const; bool full()const; void show()const; bool

栈&amp;&amp;行编辑程序

如果遇到'#',表示后退一格,即前一字符无效,如果遇到@,表示前一单词无效,即退出到空格或所在行头为止.采用栈实现. 输入:whli##ilr#e(s#*s++) 输入包含若干行,由各种字符构成. 输出:while(*s++) 利用描述规则输出最后的文本内容. Seqstack.h #ifndef _SEQSTACK_H_ #define _SEQSTACK_H_ #include<iostream> #include<assert.h> using namespace std;

3-3-行编辑程序-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第3章  栈和队列 - 行编辑程序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? SequenceStack.c        相关测试数据下载  链接? 无数据