• 数据结构-行编辑程序


    一个简单的行编辑程序的功能是:接受用户从终端输入的程序或数据,并存入用户的数据区。由于用户在终端上进行输入时,
    不能保证不出差错,因此,若在行编辑程序中“每接受一个字符即存入用户区”的做法显然是不恰当的。
    较好的做法是,设立一个输入缓冲区,用以接收用户输入的一行字符,然后逐行存入用户数据区。允许用户输入出差错,
    并在发现有误时及时改正。
    例如:当用户发现刚刚建入的一个字符是错的时,可补进一个退格符“#”,以表示前一个字符无效;如果发现当前键入的行内
    差错较多或难以补救,则可以输入一个退格符“@”,以表示当前行中的字符均无效。
    例如,假设从终端接受了这两行字符:
    whil##ilr#e(s#*s)
        outcha@putchar(*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
    ",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!='
    ') {
     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 }
  • 相关阅读:
    函数节流和防抖
    前端优化
    webpack模块
    link和@import的区别
    BFC--CSS
    javaoop_破解jdbc
    javaoop反射
    java-oop集合与泛型
    java中几个小遗漏
    java异常处理和日志管理
  • 原文地址:https://www.cnblogs.com/chengzi123/p/4392435.html
Copyright © 2020-2023  润新知