數據結構-行編輯程序


一個簡單的行編輯程序的功能是:接受用戶從終端輸入的程序或數據,並存入用戶的數據區。由於用戶在終端上進行輸入時,
不能保證不出差錯,因此,若在行編輯程序中“每接受一個字符即存入用戶區”的做法顯然是不恰當的。
較好的做法是,設立一個輸入緩沖區,用以接收用戶輸入的一行字符,然后逐行存入用戶數據區。允許用戶輸入出差錯,
並在發現有誤時及時改正。
例如:當用戶發現剛剛建入的一個字符是錯的時,可補進一個退格符“#”,以表示前一個字符無效;如果發現當前鍵入的行內
差錯較多或難以補救,則可以輸入一個退格符“@”,以表示當前行中的字符均無效。
例如,假設從終端接受了這兩行字符:
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\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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM