//检测符号匹配
#include <iostream.h>
#include <alloc.h>
const int INCREASEMENT=5;
const int INIT=10;
struct stack
{
int *top;
int *base;
int stacksize;
};
stack* IniStack();
int* GetTop(stack*);
stack* Push(stack*,int);
int* Pop(stack*);
void PrintElement(stack*);
void DestroyStack(stack*);
stack* ClearStack(stack*);
void main()
{
stack *s=IniStack();
char sign;
cin>>sign;
while(1)//输入的第一个元素的检验
{
if((sign=='@')||(sign=='#')||(sign=='x'))
{
cout<<"the sign is illegal,because the stack has no element now/n";
goto label;
}
else
{
Push(s,(int)sign);
break;
}
}
while(1)//以后输入元素的检验
{
cin>>sign;
if(sign=='x') break;
switch(sign)
{
case '#':s->top--;break;
case '@':s->top=s->base;break;
default: Push(s,(int)sign);break;
}
}
PrintElement(s);
label: DestroyStack(s);
}
stack* IniStack()
{
stack *s=(stack*)malloc(sizeof(stack));
s->base=(int*)malloc(INIT*sizeof(int));
if(!s->base)cout<<"the memory is not enough"<<endl;
s->top=s->base;
s->stacksize=INIT;
return s;
}
int* GetTop(stack *s)
{
int *i=s->top; //为了不影响栈后面的操作,不改变s->top的值,所以将其值赋给i
i--;
int *e=0;
if(s->top==s->base)cout<<"the stack is empty"<<endl;
e=i;
return e;
}
stack* Push(stack *s,int e)
{
if(s->top-s->base>=s->stacksize)
{
s->base=(int*)realloc(s->base,(s->stacksize+INCREASEMENT)*sizeof(int));
if(!s->base)cout<<"the memory is not enough"<<endl;
s->top=s->base+s->stacksize;
s->stacksize+=INCREASEMENT;
}
*(s->top)=e;
s->top++;
return s;
}
int* Pop(stack *s)
{
if(s->top==s->base) return 0;
--(s->top);
return s->top;
}
void PrintElement(stack *s)
{
int *i=s->top;
while(i!=s->base)
{
cout<<(char)(*(--i))<<endl;
}
}
void DestroyStack(stack *s)
{
free(s);
}
stack* ClearStack(stack *s)
{
s->top=s->base;
return s;
}