一、栈的定义和特点
1) 栈是一个特殊的线性表,是限定仅在表尾(栈顶)进行插入和删除操作的线性表
2) 栈又称为后进先出的线性表,简称LIFO结构
3) 表尾称为栈顶Top,表头称为栈底Base
4) 插入元素到栈顶,称为入栈;从栈顶删除最后一个元素的操作,称为出栈
5) 栈的逻辑结构: 与线性表相同,仍为一对一关系
6) 栈的存储结构: 顺序存储或链式存储
二、栈的顺序表示及基本操作
1) 利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素;栈底一般在低地址端
2) 附设top指针,指示栈顶元素在顺序栈中的位置;另设base指针,指示栈底元素在顺序栈中的位置
//通常为了方便操作,top指针指向栈顶元素的下一个地址
3) 另外,用stacksize表示栈可使用的最大容量
1.顺序栈的表示
#define SIZE 10
typedef int Datatype;
typedef struct Stack
{
Datatype *base; //栈底指针
Datatype *top; //栈顶指针
int stacksize; //栈可用的最大容量
}SqStack;
2.顺序栈的初始化
void InitStack(SqStack *p) //顺序栈的初始化
{
p->base = (Datatype*)malloc(SIZE*sizeof(Datatype));
if(!p->base)
{
printf("内存分配失败!\n"); //存储分配失败
return;
}
p->top = p->base; //栈顶指针等于栈底指针
p->stacksize = SIZE;
}
3.判断栈是否为空
int IsEmpty(SqStack *p) //判断栈是否为空
{
if (p->base == p->top) //若栈为空返回1
return 1;
return 0; //不为空返回0
}
4.求顺序栈的长度
int GetLength(SqStack *p) //求顺序栈长度
{
return p->top - p->base; //栈顶指针和栈底指针的差值
}
5.清空顺序栈
void ClearStack(SqStack *p) //清空顺序栈
{
if (p->base) //如果栈存在,将栈顶指针指向栈底
p->top = p->base;
}
6.销毁顺序栈
void DestroyStack(SqStack *p) //销毁顺序栈
{
if (p->base) //判断栈是否存在
{
free(p->base); //销毁顺序栈
p->stacksize = 0;
p->base = p->top = NULL;
}
}<