数据结构 栈 行编辑程序(可执行代码)

来源:互联网 发布:网络通信 编辑:程序博客网 时间:2024/06/07 05:33
一个简单的行编辑程序的功能是:接受用户从终端输入的程序或数据,并存入用户的数据区。由于用户在终端上进行输入时,不能保证不出差错,因此,若在行编辑程序中“每接受一个字符即存入用户区”的做法显然是不恰当的。较好的做法是,设立一个输入缓冲区,用以接收用户输入的一行字符,然后逐行存入用户数据区。允许用户输入出差错,并在发现有误时及时改正。例如:当用户发现刚刚建入的一个字符是错的时,可补进一个退格符“#”,以表示前一个字符无效;如果发现当前键入的行内差错较多或难以补救,则可以输入一个退格符“@”,以表示当前行中的字符均无效。例如,假设从终端接受了这两行字符:whil##ilr#e(s#*s)    outcha@putchar(*s=#++)则实际有效的是下列两行:while(*s)    putchar(*s++)
#include <stdio.h> #include <stdlib.h>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef int Status;   /* Status是函数的类型,其值是函数结果状态代码,如OK等 */typedef char ElemType; /* ElemType类型根据实际情况而定,这里假设为int */typedef struct{ElemType *base;ElemType *top;int stacksize;//栈能够容纳最大容量 }sqStack; Status initStack(sqStack *s){s->base = (ElemType *)malloc(STACK_INIT_SIZE *sizeof(ElemType));if(!s->base)exit(0);s->top = s->base;s->stacksize = STACK_INIT_SIZE; }void Push(sqStack *s,ElemType e){if(s->top - s->base >= s->stacksize)//满 ,追加空间 {s->base = ( ElemType *)realloc(s->base,( s->stacksize+ STACKINCREMENT )*sizeof(ElemType));if(!s->base)exit(0);s->top = s->base + s->stacksize;//设置栈顶 s->stacksize += STACKINCREMENT;//设置最大容量}*(s->top) = e;s->top++;} void Pop(sqStack *s,ElemType *e){if(s->top == s->base)return;//已经空了 s->top--; *e = *(s->top) ;}Status ClearStack(sqStack *s)//清空一个栈 {s->top = s->base;} Status DestroyStack(sqStack *s){int i,len;len = s->stacksize;for( i=0 ;i < len ; i++ ){free( s->base );s->base++;}s->base = s->top = NULL;s->stacksize = 0; }  int StackLen(sqStack s){return s.top - s.base;}void printStack(sqStack *a){sqStack s;s = *a;while(StackLen(s)>0){ElemType b;Pop(&s,&b);printf("%c",b);//注意这里不能用&b }printf("\n");printf("以上为栈里面的数据\n");}int main(){ElemType b;int i =0;//循环变量 ElemType c;//输入的字符 sqStack s;//记录筛选后的栈 initStack(&s);sqStack sNew;//最后显示的必须是把筛选后的栈倒过来initStack(&sNew);c = getchar();while(c!='\n'){while(c!='\n'){switch(c){case '#':Pop(&s,&b); break;case '@':ClearStack(&s); break;default:Push(&s,c); break;}c = getchar();}while(StackLen(s)>0)//把筛选后的栈 倒过来存到sNew里面 {ElemType a;Pop(&s,&a);Push(&sNew,a);}printStack(&sNew);ClearStack(&sNew);c = getchar();}}