首页 > 技术文章 > 数据结构-栈的实现之行编译器核心实现

ABook 2016-04-22 11:06 原文

行编译器程序实现了接受用户从终端输入的数据,并存入用户的数据区。
由于用户在终端输入的时候不能确保一字不差。所以,若在编辑过程中,输入一个字符就存入数据区是不完善的。行编译器的核心思想就是建立一个输入缓冲区,用作接受一行的数据。遇到#符号时前一个字符无效,遇到@符号时表示前面的字符均无效。确保了正确的输入。

函数实现如下:(使用了前面写的栈的顺序实现头文件。并将里面的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 }

 

推荐阅读