#include<stdio.h>
#include<malloc.h>
typedef char SElemType;
#include "stack.h"
#define EOFILE '&'
int visit(SElemType * e)
{
printf("%c", *e);
}
void LineEdit()
{
pSqstack S,T;
char str[1000];
int strlen=0;
char e;
char ch;
InitStack(&S);
InitStack(&T);
ch=getchar();
while(ch!=EOFILE)
{
while(ch!=EOFILE&&ch!='/n')
{
switch(ch){
case '#':
Pop(S,&ch);
break;
case '@':
ClearStack(S);
break;
default:
Push(S,ch);
break;
}
ch=getchar();
}
if(ch=='/n')
Push(S,ch);
while(!StackEmpty(*S))
{
Pop(S,&e);
Push(T,e);
}
while(!StackEmpty(*T))
{
Pop(T,&e);
str[strlen++]=e;
}
if(ch!=EOFILE) ch=getchar();
}
str[strlen]='/0';
printf("/n%s",str);
DestroyStack(S);
DestroyStack(T);
}
main()
{
printf("/n/n/n/n");
LineEdit();
printf("/n/nWelcome to visit http://zmofun.yeah.net !");
getch();
}
stack.h
#ifndef _STACK_H_
#define _STACK_H_
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OK 1
#define EQUAL 1
#define OVERFLOW -1
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
struct STACK
{
SElemType *base;
SElemType *top;
int stacksize;
};
typedef struct STACK SqStack;
typedef struct STACK *pSqstack;
int InitStack(SqStack **S);
void DestroyStack(SqStack *S);
int ClearStack(SqStack *S);
int StackEmpty(SqStack S);
int StackLength(SqStack S);
int GetTop(SqStack S,SElemType *e);
int Push(SqStack *S,SElemType e);
int Pop(SqStack *S,SElemType *e);
#endif
stack.c
#include "stack.h"
int InitStack(SqStack **S)
{
(*S)=(SqStack *)malloc(sizeof(SqStack));
(*S)->base=(SElemType *)malloc(STACK_INIT_SIZE *sizeof(SElemType));
if(!(*S)->base)exit(OVERFLOW);
(*S)->top=(*S)->base;
(*S)->stacksize=STACK_INIT_SIZE;
return OK;
}
void DestroyStack(SqStack *S)
{
free(S->base);
free(S);
}
int ClearStack(SqStack *S)
{
S->top=S->base;
}
int StackEmpty(SqStack S)
{
if(S.top==S.base) return TRUE;
else
return FALSE;
}
int StackLength(SqStack S)
{
int i;
SElemType *p;
i=0;
p=S.top;
while(p!=S.base)
{p++;
i++;
}
}
int GetTop(SqStack S,SElemType *e)
{
if(S.top==S.base) return ERROR;
*e=*(S.top-1);
return OK;
}
int Push(SqStack *S,SElemType e)
{
/*
if(S->top - S->base>=S->stacksize)
{
S->base=(SElemType *) realloc(S->base,
(S->stacksize + STACKINCREMENT) * sizeof(SElemType));
if(!S->base)exit(OVERFLOW);
S->top=S->base+S->stacksize;
S->stacksize += STACKINCREMENT;
}
*/
*(S->top++)=e;
return OK;
}
int Pop(SqStack *S,SElemType *e)
{
if(S->top==S->base) return ERROR;
*e=*--S->top;
return OK;
}