栈的定义
定义
栈:只允许在一端进行插入和删除操作。是一种受限制的线性表
特点
后进先出(LIFO):后面进来的元素,先出栈。
术语
栈顶(Top):线性表允许进行插入和删除的那一端。
栈底(Bottom):固定的,不允许进行插入和删除的另一端。
空栈:不含任何元素。
栈的数学性质
数学性质:n个不同元素进栈,出栈元素不同的排列的个数为(1/(n+1))*C2n2
栈的基本操作
InitStack(&S):初始化一个空栈。
StackEmpty(S):判断一个栈是否为空,若栈S为空则返回ture,否则返回false。
Push(&S,x):进栈,
Pop(&S,&x):出栈,
GetTop(S,&x):读取栈顶元素,若栈S非空,则用x返回栈顶元素。
DestroyStack(&S):销毁栈,并释放栈S占用的存储空间。
顺序栈
判空条件:栈顶指针为 -1;
判满条件:栈顶指针 = MaxSize -1;
栈长:栈顶指针 + 1;
结构体定义
typedef struct {
ElemType data[MaxSize]; //利用数组存取数据
int top; //栈顶
}SqStack;
顺序栈基本操作
初始化栈
void InitStack(SqStack &s){
s.top = -1; //初始化栈顶指针
}
判空
bool StackEmpty(SqStack s)
{
if(s.top == -1) //为-1时栈空
return true; //栈空
else
return false; //栈不空
}
进栈
bool Push(SqStack &s,ElemType e)
{
if(s.top == MaxSize-1) //判断栈是否满了,满了返回false
return false;
s.data[++s.top] = e; //不满就进栈
return true;
}
出栈
bool Pop(SqStack &s,ElemType &e)
{
if(s.top == -1) //判断栈是否为空,为空返回false
return false;
e = s.data[s.top--]; //不为空进行出栈,栈顶指针减一
return true;
}
读取栈顶元素
bool GetTop(SqStack s,ElemType &e)
{
if(s.top == -1) //判断栈是否为空
return false;
e = s.data[s.top]; //获取栈顶元素
return true;
}
链栈
链栈:采用链式存储的方式实现栈。
结构体定义
typedef struct LinkNode{ //定义单链表结构体
ElemType data; //数据域
struct LinkLNode *next; //指针域
}*LiStack;
栈的链式存储采用不带头节点的链表,比较好。
基本操作类似链表。
参考文章链接:https://blog.csdn.net/smilejianyue/article/details/125021091?spm=1001.2014.3001.5501