一个简单的行编辑程序的功能是,接受用户从终端输入的程序或数据,并存入用户的数据区,由于用户在终端上进行输入时,不能保证不出差错,因此,若在编辑程序中,每接受一个字符即存入用户数据区的做法显然不是最恰当的。

应该设立一个输入缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区。允许用户输入出差错,并在发现有误时可以及时更正。列如当用户刚发现键入的一个字符是错的时,可以补进一个退格符#,以表示前一个字符无效,如果发现当前键入的行内差错较多或难以补救,则可以键入一个退行符@,以表示当前行中的字符均无效。

输入一行终端接受的字符,输出实际有效的字符。

运行结果:

栈-行编辑程序-LMLPHP

算法思想:

设一个栈结构,每当从终端接受了一个字符之后。如果它既不是退格符也不是退行符,则将该字符压入栈顶。如果是一个退格符,则从栈顶删去一个字符,如果他是一个退行符,则将字符栈清为空栈。

算法实现:

void LineEdit(){
//利用字符栈S,从终端接受一行并传送至调用过程的数据区
//设一个栈结构,每当从终端接受了一个字符之后。如果它既不是退格符
//也不是退行符,则将该字符压入栈顶。如果是一个退格符,则从栈顶删
//去一个字符,如果他是一个退行符,则将字符栈清为空栈。
	SqStack<char> S;
	char ch;
	char e;
    InitStack(S);//构造空栈
	ch=getchar(); //从终端接受第一个字符
	while(ch!=EOF){//EOF为全文结束符
	    while(ch!=EOF&&ch!='\n'){
	       switch(ch){
           	  case '#': //当栈非空时退栈
	         	Pop(S,e);
		        break;
              case '@': //重置S为空栈
		        ClearStack(S);
	         	break;
	          default:
	         	Push(S,ch); //有效字符进栈,为考虑栈满情形
	        	break;
		   }
	       ch=getchar();//从终端接受下一个字符
		}
		PrintStack(S);
        ClearStack(S);//重置栈为空栈
     	if(ch!=EOF)
	        ch=getchar();
	}
    DestroyStack(S);
}

 

 

 

 

10-04 21:33