链栈 缓冲区输入模拟
如下图所示,当我们在DOS命令窗口输入指令或者数据时,由于不能确保输入的数据完全不出错, 并不采用“每接收一个字符就存入程序变量”的方案,而是建立一个输入数据缓冲区,用于暂存用户输入的数据,当接收回车键后,数据被存入程序变量。
如果用户输入错误,可以使用退格键,删除错误的内容和缓冲区的数据。
现在用栈模拟一个输入缓冲区。规定用户的输入:
1:若是退格符#,从栈顶删去一个元素,即出栈Pop;
2:若是退行符@,将字符栈清空,即clear;
3:若不是#或@,即为有效字符,将该字符入栈,即Push;
重要事项:main()函数中不允许出现对于链栈结点的数据域data和指针域next的直接使用操作。所有功能均通过子函数完成。
输入要求:
输入不定长的任意字符
输出要求:
输出经过处理后最后被写入程序的字符
思路提示:
程序中出现了循环条件while(scanf("%c",&ch)!=EOF)
意思是循环的输入1个字符串,每1个字符都存入变量ch中,当按下回车时代表到了字符串结尾,返回EOF
相当于scanf("%c",&ch); ch!=’\0’
但是!这句无法在windows环境下运行, 如果大家要在VC或VS软件中调试程序, 请把while(scanf("%c",&ch)!=EOF)替换成while((ch=getchar())!=’\n’)
#include <stdio.h>
1
typedef struct node{
datatype data;
struct node* next;
}LinkStack;
1
void Traverse(LinkStack *top){
for(LinkStack *p=top->next;p;p=p->next){
printf("%c",p->data);
}
putchar(10);
}
int main(){
char ch;
LinkStack *top;
InitStack(&top);
while(scanf("%c",&ch)!=EOF) //循环输入若干字符,每个字符存放在ch中,按回车结束输入
{
1
}
1
return 0;
}