//不需要设表头结点,使用top指向栈顶元素
#include<iostream.h>
#include<stdlib.h> //exit的原型定义
#define STACK_INIT_SIZE 100
#define OVERFLOW -2
#define ERROR 0
#define OK 1
typedef int Status;
typedef char SElemType;
typedef struct SNode
{
SElemType data;
struct SNode *next;
}StackNode,*LinkStack;
void InitStack(LinkStack &top)
{
top=NULL;
}
int StackEmpty(LinkStack top)
{
return(top==NULL);
}
Status push(LinkStack &top,SElemType x)
{
StackNode *p=new StackNode;
if(!p)
exit(OVERFLOW);
p->data=x;
p->next=top;
top=p;
return OK;
}
Status pop(LinkStack &top,SElemType &e)
{
StackNode *p=top;
if(StackEmpty(top))
return ERROR;
top=p->next;
e=p->data;
delete(p);
return OK;
}
void create_stack(LinkStack &top)
{
for(char ch='a';ch<='g';ch++)
push(top,ch);
}
void StackTravers(LinkStack top)
{
StackNode *p=top;
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
void MakeEmpty(LinkStack &top)
{
StackNode *p;
while(top!=NULL)
{
p=top;
top=top->next;
delete p;
}
}
Status GetTop(LinkStack top,SElemType &e)
{
if(StackEmpty(top))
return ERROR;
e=top->data;
return OK;
}
void main()
{
LinkStack top;
SElemType e;
InitStack(top);
create_stack(top);
StackTravers(top);
cout<<"input Element e=";
cin>>e;
push(top,e);
StackTravers(top);
if(pop(top,e))
cout<<"pop top element="<<e<<endl;
else
cout<<"Stack is Empty\n";
if(GetTop(top,e))
cout<<"get top element="<<e<<endl;
else
cout<<"Stack is Empty\n";
MakeEmpty(top);
if(pop(top,e))
cout<<"pop top element="<<e<<endl;
else
cout<<"Stack is Empty\n";
}