//链式栈
#include<iostream>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int SElemType;
typedef int Status;
using namespace std;
typedef struct SNode
{
SElemType data;
struct SNode *next;
}SNode, *LinkStackPtr;
typedef struct LinkStack
{
LinkStackPtr top;
int count;
}*PLinkStack;
Status InitStack(PLinkStack &S)
{//初始化栈
S=(PLinkStack)malloc(sizeof(struct LinkStack));
(S)->top=NULL;
(S)->count=0;
return OK;
}
Status ClearStack(PLinkStack &S)
{//清空栈
LinkStackPtr p;
while(S->top){
p=S->top;
S->top=S->top->next;
S->count--;
free(p);
}
return OK;
}
Status DestroyStack(PLinkStack &S)
{//销毁栈
ClearStack(S);
free(S);
return OK;
}
Status StackEmpty(PLinkStack S)
{//判空
if(S->top)
return FALSE;
else
return TRUE;
}
Status GetTop(PLinkStack S,SElemType &e)
{//取栈顶元素
if(!S->top)
return ERROR;
e=S->top->data;
return OK;
}
Status Push(PLinkStack &S,SElemType e)
{//入栈
LinkStackPtr p=(LinkStackPtr)malloc(sizeof(struct SNode));
p->data=e;
p->next=S->top;
S->top=p;
S->count++;
return OK;
}
Status Pop(PLinkStack &S,SElemType &e)
{//出栈
LinkStackPtr p;
if(!GetTop(S,e))
return ERROR;
p=S->top;
S->top=S->top->next;
S->count--;
free(p);
return OK;
}
int StackLength(PLinkStack S)
{//返回栈长
return S->count;
}
Status StackTraverse(PLinkStack S,Status (*visit)(SElemType))
{//遍历栈
LinkStackPtr p;
p=S->top;
while(p){
visit(p->data);
p=p->next;
}
cout<<endl;
return OK;
}
Status visit(SElemType e)
{
cout<<e<<' ';
return OK;
}
int main()
{
SElemType e,i;
PLinkStack S;
if(InitStack(S))
for(i=1; i<=10; i++)
{
Push(S,i);
}
cout<<"将1~10入栈: ";
StackTraverse(S,visit);
Pop(S,e);
cout<<"取栈顶元素: "<<e<<endl;
cout<<"将元素1入栈"<<endl;
Push(S,1);
cout<<"栈中元素依次为: ";
StackTraverse(S,visit);
cout<<"当前栈是否为空: "<<endl;
if(StackEmpty(S))
cout<<"为空"<<endl;
else
cout<<"不为空"<<endl;
GetTop(S,e);
cout<<"当前栈顶元素为: "<<e<<endl;
cout<<"当前栈的长度为: "<<StackLength(S)<<endl;
ClearStack(S);
if(StackEmpty(S))
cout<<"清空栈后: 栈为空"<<endl;
else
cout<<"清空栈失败"<<endl;
DestroyStack(S);
return 0;
}
07-25
886