#include<iostream.h>
#include<stdio.h>
#include<stdlib.h> //exit的原型定义
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERFLOW -2
#define OK 1
#define ERROR 0
typedef int Status;
typedef char SElemType;
typedef struct
{
SElemType *base; //栈底指针
SElemType *top; //栈顶指针
int stacksize; // 当前已分配的栈空间
}SqStack;
void InitStack(SqStack &S)
{
//构造一个空的顺序栈 S
S.base=new SElemType[STACK_INIT_SIZE];
if(!S.base)
exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
}
Status StackEmpty(SqStack S)
{
//判栈空
if(S.top==S.base)
return OK; //空则返回1
else
return ERROR; //不空返回0
}
Status StackFull(SqStack S)
{
//判栈满
if(S.top-S.base>=S.stacksize)
return OK; //判栈满,满则返回1
else
return ERROR; //否则返回0
}
Status push(SqStack &S,SElemType x)
{
//插入元素x为新的栈顶元素
if(StackFull(S))
return ERROR;
*S.top++=x;
return OK;
}
Status pop(SqStack &S,SElemType &e)
{
//若栈空返回0,否则栈顶元素退出到e并返回1
if(StackEmpty(S))
return ERROR;
--(S.top);
e=*(S.top);
return OK;
}
void StackTravers(SqStack S)
{
SqStack p=S;
while(p.top>S.base)
cout<<*--p.top<<" ";
cout<<endl;
}
void GetTop(SqStack S,SElemType &e)
{
if(StackEmpty(S))
cout<<"stack is empty!\n";
e=*--S.top;
}
void ClearStack(SqStack &S)
{
while(S.top!=S.base)
--(S.top);
}
void DestroyStack(SqStack &S)
{
delete[]S.base;
}
void LineEdit()
{
SqStack S;
SElemType ch;
InitStack(S);
printf("input ch=");
ch=getchar();
while(ch!='0')
{
//EOF为全文结束符 while1
while(ch!='\n')
{
//while2 line
switch(ch)
{
case'#':pop(S,ch);
break;
case'@':ClearStack(S);
break; //重置S为空栈
default:push(S,ch);
break;
}//switch
ch=getchar(); //从终端接收下一个字符
}//while2 line
StackTravers(S);
ClearStack(S); //重置S为空栈
if(ch!='0')
{
printf("input ch=");
ch=getchar();
}
}//while1
DestroyStack(S);
}
void main()
{
LineEdit();
}