栈
限定仅在表尾插入或删除操作的线性表。
表尾称为栈顶,表头称为栈底
先进后出
插入元素为入栈,删除元素为出栈
一.基本操作
基本操作 | 操作结果 |
---|---|
InitStack(&S) | 构造一个空栈 |
DestroyStack(&S) | 销毁栈S |
ClearStack(&S) | 将S清为空栈 |
StackEmpty(S) | 若S为空栈,返回True,否则返回False |
StackLength(S) | 返回栈长,S个数 |
GetTop(S,&e) | 用e返回S 栈顶元素 |
Push(&S,e) | 插入元素e为新的栈顶元素 |
Pop(&S,&e) | 删除S栈顶元素并用e返回其值 |
StackTraverse(S,visit()) | 从栈底到栈顶对S中每个数据调用visit |
二.栈的表示和实现
和线性表类似,栈也有两种存储表示方法
2.1顺序栈
一组地址连续的存储单元依次存放从栈底到栈顶的元素
top元素指示栈顶元素在顺序栈中位置
以top=0表示空栈
2.1.1类型说明
typedef struct
{
SElemType *base;//指向栈底
SElemType *top;//栈顶指针
int stacksize;//栈目前可使用的最大容量
} SqStack;
top=base可作为栈空的标记
插入新的栈顶元素,top增1
2.1.2栈的顺序存储表示
#define STACK_INIT_SIZE 100;//存储空间初始分配量
#define STACKINCREMENT 10;//存储空间分配增量
typedef struct
{
SElemType *base;//栈构造之前和销毁之后,base值为NULL
SElemType *top;//栈顶指针
int stacksize;//当前已分配到饿存储空间,以元素为单位
} SqStack;
2.1.3基本操作
构造空栈
Status InitStack(SqStack &S)
{
S.base=(SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
销毁栈
void DesTroy(SqStack &S)
{
free(S.base);
S.top=S.base=NULL;
S.stacksize=0;
}
如果S 为空返回True,否则返回False
Status StackEmpty(SqStack S)
{
if(S.top==S.base)return TRUE;
else return FALSE;
}
用e返回栈顶元素,并返回OK,否则返回ERROR
Status GetTop(SqStack S,SElemType &e)
{
if(S.base==S.top)return ERROR;
e=*(S.top-1);
return OK;
}
插入元素e为新的栈顶元素
Status Push(SqStack &S,SElemType e)
{
if(S.top-S.base>=S.stacksize)//栈满,追加存储空间
{
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;//e入栈,栈顶上移
}
若S不空,用e返回其值,并返回OK
Status Pop(SqStack &S,SElemType &e)
{
if(S.base==S.top)return ERROR;
e=*(--S.top);//栈顶元素赋给e,栈顶指针下移
return OK;
}
从栈底到栈顶,依次对每个元素调用函数visit()
void StackTraverse(SqStack S,void(*visit)(SElemType))
{
SElemType *p=S.base;
while(S.top>p) visit(*p++);
printf("\n");
}