今天我的博客终于迎来了第一位关注着,但是同时我也发现了之前的程序在出栈时是有一些问题的,但是还没找到确切的原因,然后这一段代码是今天晚上实现的行编辑的demo,但是现在是不完善的,明天或者后天我将会将它彻底修复。
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef struct Node
{
Node *next;
char c;
}*StackElem;
typedef struct Stack
{
StackElem base;
StackElem top;
int length;
};
Status InitStack(Stack *S);
Status Push(Stack *S, char c);
Status Pop(Stack *S, char *c);
Status GetTop(Stack S, char *c);
Status ClearStack(Stack *S);
Status StackEmpty(Stack S);
int main(void)
{
Stack S,T;
InitStack(&S);
InitStack(&T);
char c;
scanf("%c",&c);
while(c != '*')
{
switch(c)
{
case '#':
if(!StackEmpty(S))
{
Pop(&S, &c);
}else
Push(&S, '#');
break;
case '@':
ClearStack(&S);
break;
default:
Push(&S, c);
}
scanf("%c",&c);
}
while(!StackEmpty(S))
{
Pop(&S, &c);
Push(&T, c);
}
while(!StackEmpty(T))
{
Pop(&T, &c);
printf("%d",c);
}
system("pause");
}
Status InitStack(Stack *S)
{
S->base = (StackElem)malloc(sizeof(StackElem));
S->base->next = NULL;
S->top = S->base;
S->length = 0;
return OK;
}
Status Push(Stack *S, char c)
{
if(!S->base)
return ERROR;
StackElem q = (StackElem)malloc(sizeof(StackElem));
(S->top)->c = c;
q->next = S->top;
S->top = q;
S->length++;
return OK;
}
Status Pop(Stack *S, char *c)
{
if(S->base == S->top)
return ERROR;
*c = S->top->next->c;
StackElem q = S->top->next;
//free(S->top);
S->top = q;
S->length--;
return OK;
}
Status GetTop(Stack S, char *c)
{
if(S.base == S.top)
return ERROR;
*c = S.top->next->c;
return OK;
}
Status ClearStack(Stack *S)
{
S->top = S->base;
S->length = 0;
return OK;
}
Status StackEmpty(Stack S)
{
if(S.length == 0)
return TRUE;
return FALSE;
}
不过令我很得意的是,我还是对严蔚敏的程序做了一点小小的修改,使他更加强大了一些。
PS:刚刚经女神大人的提醒终于发现了错误之所在,原来要利用一个getchar()来抹掉回车的字符才能够正常使用,嗯就是这样!。