#include <stdlib.h> /* For _MAX_PATH definition */ #include <stdio.h> #include <malloc.h> #include <string.h> #include <conio.h> #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10
struct SqStack { char *base; char *top; int stacksize; };
void InitStack(SqStack &S) { S.base=(char*)malloc(STACK_INIT_SIZE *sizeof(char)); if (!S.base) exit(1); S.top=S.base; S.stacksize=STACK_INIT_SIZE; } void push(SqStack &S,char e) { if(S.top-S.base>=S.stacksize) { S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char)); if (!S.base) exit(1); S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *S.top++=e; } char pop(SqStack &S,char &e) { if (S.top==S.base) return false; e=*--S.top; return e; } void ClearStack(SqStack &S) { S.top=S.base; } void DestroyStack(SqStack &S) { free(S.base); S.top=S.base; } bool StackEmpty(SqStack &S) { if (S.top==S.base) return true; return false; } /*void PrintStack(SqStack &S) { char e; while (!StackEmpty(S)) { pop(S,e); printf("%d",e); } }*/ void main() { char ch,e; SqStack S,D; InitStack(S); InitStack(D); ch=getchar(); while (ch!=EOF) { while(ch!=EOF&&ch!='/n') { switch(ch) { case'#':pop(S,e);break; case'@':ClearStack(S);break; default:push(S,ch);break; } ch=getchar(); } while (!StackEmpty(S)) { e=pop(S,e); push (D,e); } while (!StackEmpty(D)) { e=pop(D,e); printf("%c",e); } ClearStack(S); if(ch!=EOF) ch=getchar(); } DestroyStack(S); } |