目录
一. 前言
二.顺序栈
三. 链栈
一. 前言
简而言之,顺序栈就是栈的顺序存储,链栈就是栈的链式存储。
二.顺序栈
下面我们来看下顺序栈的结构定义:
typedef char SElemType;
#define MAXSIZE 100
typedef struct{SElemType * base; //栈底指针SElemType * top; //栈顶指针int stacksize; //栈可用的最大容量
}SqStack;
其中的SElemType就表示用户自己所定义的数据类型。
因为栈都满足后进先出的特点,所以我们一般操作的都是我们的栈顶指针top。当我们的栈顶指针top==栈底指针base的时候,就表示这是个空栈。而当我们的top-base==stacksize的时候,就表示这个栈已经满了,就不能执行如入栈等操作了。
下面我们来看下顺序栈的初始化,如下所示:
int InitStack(SqStack &S){S.base=new SElemType[MAXSIZE]; //给栈底分配空间if(!S.base) return -1;S.top=S.base; //初始时,栈顶指针等于栈底指针S.stacksize=MAXSIZE;
}
判断顺序栈是否为空栈的算法如下:
int StackEmpty(SqStack S){if(S.top==S.base)return true; //栈为空的时候,返回trueelse return false;
}
求顺序栈的长度算法如下:
int StackLength(SqStack S){return S.top-S.base; //栈顶指针减去栈底指针就是元素个数
}
清空顺序栈的算法如下:
int ClearStack(SqStack S){if(S.base) S.top=S.base; //栈为空的条件return 1;
}
销毁顺序栈的算法如下:
int DestroyStack(SqStack&S){if(S.base){delete S.base;S.stacksize=0;S.base=S.Top=NULL;}return 1;
}
顺序栈的入栈:
int Push(SqStack&S,SElemType e){if(S.top-S.base==S.stacksize) return -1; //栈满时,入不了栈*S.top++=e;return 1;
}
顺序栈的出栈:
int Pop(SqStack&S,SElemType &e){if(S.top==S.base)return -1;e=*--S.top; //因为top指向有数据的上一位return 1;
}
三. 链栈
链栈是一种特殊的单链表,只能在链表的头部进行操作。
下面我们来看下链栈的结构定义:
typedef struct StackNode{SELemType data;struct StackNode* next;
}StackNode,*LinkStack;
链栈的特点如下所示:
下面我们来看下链栈的初始化:
void InitStack(LinkStack&S){S=NULL;return 1;
}
只需要让链栈指向空指针即可。
判断链栈是否为空:
int StackEmpty(LinkStack S){if(S==NULL) return true;else return false;
}
链栈的入栈:
int Push(LinkStack &S,SElemType e){StackNode* p=new StackNode; //生成新结点p,并分配好空间p->data=e; //将新结点的数据域置为ep->next=S; //将新结点插入栈顶S=p; //修改栈顶指针return 1;
}
链栈的出栈:
int Pop(LinkStack&S,SElemType &e){if(S=NULL) return -1;e=S->data; //将栈顶的值取出StackNode* p=S; //将此时的栈顶指针保存S=S->next; //取出栈顶的指针后,栈顶的指针需要更改delete p; //释放空间return 1;
}
取栈顶元素
SElemType GetTop(LinkStack S){if(S!=NULL)return S->data;
}
以上便是我们顺序栈和链栈的所有操作算法。