目录
栈的顺序存储结构
声明顺序栈类型
typedef struct
{
ElemType data[MaxSize];
int top; //栈顶指针,即存放栈顶元素在data数组的下标
}SqStack //顺序栈类型
初始化栈
void InitStack(SqStack *&s)
{
s=(SqStack*)malloc(sizeof(SqStack));
s->top=-1;
}
销毁栈
void DestroyStack(SqStack *&s)
{
free(s);
}
判断栈是否为空
bool StackEmpty(SqStack *&s)
{
return(s->top==-1);
}
进栈
bool Push(SqStack *&s,ElemType e)
{
if(s->top == MaxSize-1) //栈满的情况,即栈上溢出
return false;
s->top++; //栈顶指针增1
s->data[s->top]=e; //元素e放在栈顶指针处
return true;
}
出栈
bool Pop(SqStack *&s,ElemType &e)
{
if(s->top==-1) //栈为空的情况,即栈下溢出
return false;
e=s->data[s->top]; //取栈顶元素
s->top--; //栈顶指针减1
return true;
}
取栈顶元素
bool GetTop(SqStack *s,ElemType &e)
{
if(s->top==-1) //栈为空的情况,即栈下溢出
return false;
e=s->data[s->top]; //取栈顶元素
return true;
}
栈的链式存储结构
链栈的结点类型声明
typedef struct linknode
{
ElemType data; //数据域
struct linknode *next //指针域
}LinkStNode; //链栈结点类型
初始化栈
void InitStack(LinkStNode *&s)
{
s=(LinkStNode *)malloc(sizeof(LinkStNode));
s->next=NULL;
}
销毁栈
void DestroyStack(LinkStNode *&s)
{
LinkStNode *pre=s,*p=s->next; //pre指向头结点,p指向首结点
while(p!=NULL) //循环到p为空
{
free(pre);
pre=p;
p=p->next;
}
free(pre); //此时pre指向尾结点,释放其空间
}
判断栈是否为空
bool StackEmpty(LinkStNode *s)
{
return(s->next==NULL);
}
进栈
void Push(LinkStNode *&s,ElemType e)
{
LinkStNode *p;
p=(LinkStNode *)malloc(sizeof(LinkStNode));
p->data=e; //存放元素E
p->next=s->next; //将p结点插入作为首结点
s->next=p;
}
出栈
bool Pop(LinkStNode *&s,ElemType &e)
{
LinkStNode *p;
if(s->next==NULL) //栈空的情况
return false;
p=s->next; //p指向首结点
e=p->data; //提取首结点
s->next=p->next; //删除首结点
free(p); //释放被删结点的存储空间
return true;
}
取栈顶元素
bool GetTop(LinkStNode *s,ElemType &e)
{
if(s->next==Null) //栈空的情况
return false;
e=s->next->data; //提取首结点值
return true;
}