数据结构-栈的实现之行编译器核心实现
行编译器程序实现了接受用户从终端输入的数据,并存入用户的数据区。
由于用户在终端输入的时候不能确保一字不差。所以,若在编辑过程中,输入一个字符就存入数据区是不完善的。行编译器的核心思想就是建立一个输入缓冲区,用作接受一行的数据。遇到#符号时前一个字符无效,遇到@符号时表示前面的字符均无效。确保了正确的输入。
函数实现如下:(使用了前面写的栈的顺序实现头文件。并将里面的SElemType宏由int改为char)
1 void LineEdit() 2 { 3 //利用字符栈S,从终端接收一行并传送至调用过程的数据区。 4 char ch,*temp; 5 Stack S; 6 InitStack(S); //构造空栈S 7 printf("请输入一行(#:退格;@:清行):\n"); 8 ch = getchar(); //从终端接收第一个字符 9 while (ch != EOF) //EOF为全文结束符(stdio头文件下的宏定义值为(-1)输入Ctrl+Z的时候结束循环 10 { 11 while (ch != EOF && ch != '\n') 12 { 13 switch (ch) 14 { 15 case '#': 16 Pop(S, ch); 17 break; // 仅当栈非空时退栈 18 case '@': 19 ClearStack(S); 20 break; // 重置S为空栈 21 default : 22 Push(S, ch); 23 break; // 有效字符进栈,未考虑栈满情形 24 } 25 ch = getchar(); // 从终端接收下一个字符 26 } 27 // 将从栈底到栈顶的栈内字符传送至调用过程的数据区; 28 temp=S.base; 29 while(temp!=S.top) 30 { 31 printf("%c",*temp); //这里做控制台的输出;依情况讨论 32 ++temp; 33 } 34 //StackTraverse(S,Visit); //输出全部做测试 35 ClearStack(S); // 重置S为空栈 36 printf("\n"); 37 if (ch != EOF) 38 { 39 printf("请输入一行(#:退格;@:清行):\n"); 40 ch = getchar(); 41 } 42 } 43 DestroyStack(S); 44 }