1.顺序栈
2.链栈
顺序栈
利用一组地址连续的存储单元依次存放栈底到栈顶的数据元素。
1.顺序栈的表示
栈有两个指针:top指向栈顶元素之上
base指向栈底元素
空栈:top == base
满栈:top-base = stacksize
入栈:top上移,出栈top下移
特点:后进先出,方便简单,容易溢出
# define MAXSIZE 100
typedef struct{
SElem Type *base;
SElem Type *top;
int stacksize;
}Sqstack;
2.顺序栈的初始化
算法思想:
1.开辟一块指定元素个数的空间;
2.令top 和base 相等,栈为空;
3.初始化stacksize = MAXSIZE.
status Initstack(Sqstack &S){
S.base = new SElemType[MAXSIZE];
if(!S.base)
exit OverFlow;
S.top = S.base;
S.stacksize = MAXSIZE;
return OK;
}
3.判断顺序栈是否为空
算法思想:
判断base 和top 是否相等
status StackEmpty(Sqstack &S){
if(S.top == S.base)
return TRUE;
else
return FALSE;
}
4.清空顺序栈
status ClearStack(Sqstack &S){
if(S.base)
S.top = S.base;
return OK;
}
5.销毁顺序栈
status Destroystack(Sqstack &S){
if(S.base)
{delete S.base;
S.stacksize = 0;
S.top = S.base = NULL;}
return OK;
}
6.入栈
算法思想:
1.判断栈是否已满,若满则溢出;
2.元素e压入栈;
3.栈顶指针top+1.
status push(Sqstack &S, SElemType e){
if(S.top - S.base == stacksize)
return ERROR;
*S.top = e;
S.top++;
return OK;
}
7.出栈
算法思想:
1.判断栈是否为空;
2.获取元素出栈;
3.栈顶指针top-1.
status pop(Sqstack &S, SElemType &e){
if(S.base == S.top)
return ERROR;
S.top--;
e = *S.top;
return OK;
}
链栈
链栈是受限的单链表,只能在链表头部进行插入删除操作。
1.链表的定义
typedef struct StackNode{
SElemType data;
struct StackNode *next;
}StackNode,*LinkStack;
链表的头指针就是栈顶,不需要头结点;
链栈基本不存在满栈的情况;
空栈相当于头指针指向空;
插入和删除只能在栈顶进行。
2.链栈的初始化
头指针为空即可
void InitStack(LinkStack &S){
S = NULL;
return OK;
}
3.判断链栈是否为空
判断头指针是否为空
status StackEmpty(LinkStack &S)
{
if(S == NULL)
return TRUE;
else
return FALSE;
}
4.入栈
算法思想:
1.创建一个空间p;
2.给p的data赋值;
3.给P的next赋值,原来栈顶元素的地址;
4.top上移
status push(LinlStack &S,SElemType e)
{
p = new StackNode;
p->data = e;
p->next = S;
S = P;
return OK;
}
5.出栈
算法思想:
1.判断栈是否为空;
2.获取栈顶元素;
3.top下移
status pop(LinkStack &S,SElemType &e){
if(S == NULL)
return ERROR;
e = S->data;
p = S;
S = S->next;
delete p;
return OK;
}