目录
栈的定义和特点
栈是限定仅在表尾进行插入或删除操作的线性表。
表尾称为栈顶(top),表头称为栈底(bottom),不含元素的空表称为空栈。
特点:先进后出(记忆:洗碗的时候把碗一个一个往上叠,拿碗的时候从上面一个一个拿出)
顺序栈的表示和实现
顺序栈:指利用顺序结构实现的栈。
鉴于C语言中数组的下标是从0开始的,描述语言时不便,便设指针base指示栈底元素在顺序栈的位置。当top=base时,表示空栈。
//顺序栈的存储结构
#define MAXSIZE 100
typedef struct{
SElemType *base;//栈尾指针
SElemType *top;//栈顶指针
int stacksize;//栈可用的最大容量
}SqStack;
说明:
- base为栈底指针,初始化完成后,base指针始终指向栈尾。若base=NULL,则此栈不存在。
- top为栈顶指针,top初始指向栈尾(此时top=base),每当插入一个元素时,*top都加1。栈非空时,top始终指向栈顶元素的上一个位置。
- stack指示栈可用最大容量。
顺序栈的初始化
算法步骤:
- 为顺序栈动态分配一个最大容量为MAXSIZE的数组空间,使base指向这个数组的基地址(也可以认为是这个数组第一个下标0),即栈底。
- 将栈顶指针top初始为base,表示栈为空。
- stacksize置为栈的最大容量MAXSIZE。
算法描述:
status InitStack(SqStack &s){
//构造空栈
s.base=(SElemType*)malloc(MAXSIZE *sizeof(SElemType));
//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
if(!base) return ERROR;//如果base为0,就说明分配错误
s.top=s.base;//top初始为base
S.stacksize=MAXSIZE;//stacksize的值为MAXSIZE
return OK;
}
顺序栈的入栈
算法步骤:
- 判断是否栈满,若满则返回ERROR。
- 新元素压入栈顶,栈顶指针加1.
算法描述:
status Push(SqStack &S,SElemType e){
//用push来表示入栈操作,插入新元素e为新的栈顶元素
if(S.top-S.base==S.stacksize) return ERROR;//判断是否栈满
*S.top++=e; //将元素e压入栈顶,栈顶指针加1
return OK;
}
顺序表的出栈
算法步骤:
- 判断是否为空栈。
- 栈顶指针减1,栈顶元素出栈。
算法描述:
status Pop(SqStack &s,SElemType &e)
{//用Pop来表示出栈操作,使用引用删除元素e
if(S.top==S.base) return ERROR;//判断是否为空
e=*--S.top;//栈顶指针减1,元素e出栈
return OK;
}