赞
踩
初始化操作(InitStack(&S))
销毁栈操作(DestroyStack(&S))
判断 S 是否为空栈(StackEmpty(S))
求栈的长度(StackLength(S))
取栈顶元素(GetTop(S,&e))
清空栈操作(CelarStack(&S))
入栈操作(Pust(&S,e))
出栈操作(Pop(&S,&e))
由于栈本身就是线性表,于是栈也有顺序存储和链式存储两种实现方式。
存储方式:同一般线性表的顺序存储结果完全相同
举个例子
栈满时的处理方法
使用数组作为顺序栈存储方式的特点:简单、方便、但易产生溢出(数组大小固定)
上溢:栈已经满,又要压入元素。
下溢:栈已经空,还要弹出元素。
顺序栈的定义
//顺序栈的存储结构
#define MAXSIZE 100//顺序栈存储空间的初始分配量
typedef struct
{
SElemType* base;//栈底指针
SElemType* top;//栈顶指针
int stacksize;//栈可用的最大容量
}SqStack;//结构类型叫顺序栈
算法步骤
算法描述
//构造一个空栈
Status InitStack(SqStack &S)
{
s.base = new SElemType(MAXSIZE);;/为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
if(!S.base)
{
exit(OVERFLOW);//存储分配失败
}
S.top = S.base;//top初始为base,表示空栈
S.stacksize = MAXSIZE;//stacksize置为栈的最大容量MAXSIZE
return OK;
}
算法描述
//若栈为空,返回TRUE;否则返回FALSE
Status StackEmpty(SqStack S)
{
if(S.top == S.base)
{
return TRUE;
}
else
{
return FALSE;
}
}
算法描述
//求当前顺序栈中有多少个元素
int StackLength(SqStack S)
{
return S.top - S.base;
}
将栈里面的数据元素全部清除,栈本身保留。
不管栈里面存着什么东西,只要当 top == base 的时候,就说明栈已经被清空了。
请空前提:base 要存在(栈空间存在)+
算法描述
//将顺序栈内的元素全部清除
Status ClearStack(SqStack S)
{
if(S.base)//栈底指针不为空
{
S.top = S.base;
}
return OK;
}
算法描述
//销毁顺序栈,释放这块空间
Status DestoryStack(SqStack &S)
{
if(S.base)//栈空间存在
{
delete S.base;
S.stacksize = 0;
S.base = S.top = NULL;
}
}
算法步骤
算法描述
//插入元素为e为新的栈顶元素
Status push(SqStack &S,SElemType e)
{
if(S.top-S.base == S.stacksize)//栈满
{
return ERROR;
}
将元素e压入栈顶,栈顶指针加1
*S.top = e;//
S.top++ ;
return OK;
}
算法步骤
算法描述
//若栈不空,则删除s的栈顶元素;
//用e返回其值,并返回OK
Status Pop(SqStack &S,SElemType &e)
{
if(S.top == S.base)//栈空
{
return ERROR;
}
--S.top;//栈顶指针下移,指向栈顶元素
e = *S.top;//用e接收栈顶元素
return OK;
}
类型定义
//链栈的存储结构
typedef struct StackNode
{
ElemType data;
struct StackNode* next;
}StackNode,*LinkStack;
栈的存储
链栈的特点
算法描述
//构造一个空栈S,减栈顶指针置空
void InisStack(LinkStack &S)
{
S = NULL;
return OK;
}
算法描述
//判断链栈是否为空
Status StackEmpty(LinkStack S)
{
if(S == NULL)
{
return TRUE;
}
else
{
return FALSE;
}
}
算法步骤
算法描述
//在栈顶插入元素e
Status Push(LinkStack &S,SElemType e)
{
p = new StackNode;//生成新结点p
p -> data = e;//将新街点数据域置为e
p -> next = S;//将新结点插入栈顶
S = p;//修改栈顶指针为p
return OK;
}
算法步骤
算法描述
//删除 S 的栈顶元素,用 e 接收其返回值
Status pop(LinkStack &S,SElemType &e)
{
if(NULL == S)
{
return ERROR;//栈空
}
e = S->data;//将栈顶元素赋给 e
p = S;//用 p 临时保存栈顶元素空间,以备释放
S = S->next;//修改栈顶指针
delete p;//释放原来栈顶元素的空间
return OK;
}
算法描述
//返回S的栈顶元素,不修改栈顶指针
SElemType GetTop(LinkStack S)
{
if(S != NULL)//栈非空
{
return S -> data;
//返回栈顶元素的值,栈顶指针不变
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。