例:当用户发现刚刚键入的一个字符是错的时,可补进一个退格符“#”,以表示前一个字符无效;如果发现当前键入的行内差错较多或难以补救,则键入一个退行符“@”,以表示当前行中的字符均无效。
实现代码如下:
#include
#include
#ifndef TRUE
#define TRUE
#endif
#ifndef FALSE
#define FALSE
#endif
typedef char ElemType;
typedef struct Stack{
ElemType data;
struct Stack *next;
}Stack, *SqLinkStack;
SqLinkStack S;
char ch;
SqLinkStack InitStack()
{
SqLinkStack Tmp;
Tmp = (SqLinkStack)malloc(sizeof(Stack));
if(Tmp == NULL){
printf("alloc stack failure.\n");
exit(0);
}
Tmp->next = NULL;
S = Tmp;
return S;
}
void Push(SqLinkStack S, char *e)
{
SqLinkStack tmp;
tmp = (Stack *)malloc(sizeof(Stack));
tmp->data = *e;
tmp->next = S->next;
S->next = tmp;
return;
}
void Pop(SqLinkStack S, char *e)
{
SqLinkStack r;
r = S->next;
if(r == NULL){
printf("it's empty stack.\n");
return;
}
*e = r->data;
S->next = r->next;
free(r);
}
void ClearStack(SqLinkStack S)
{
SqLinkStack r;
while(S->next != NULL){
r = S->next;
S->next = r->next;
free(r);
}
exit(0);
}
SqLinkStack LineEdit(SqLinkStack S)
{
ch = getchar();
while(ch != EOF){
while(ch != EOF && ch != '\n'){
switch(ch){
case '#':Pop(S, &ch); break;
case '@':ClearStack(S); break;
default:Push(S, &ch);
}
ch = getchar();
}
return S;
}
}
void TraverseStack(SqLinkStack S)
{
char e;
while(S->next != NULL){
Pop(S, &e);
printf("%c ", e);
}
}
int
main(void)
{
S = InitStack();
S = LineEdit(S);
TraverseStack(S);
}