一、思维导图:
**ps:**栈和线性表非常类似,学习过程中可以对比进行学习。
二、栈的定义:
特殊的线性表。仅在标尾进行插入或删除操作的线性表
栈顶 = 表尾
栈底 = 表头
空栈 = 空表
三、栈的特点:
LIFO(last in first out)
四、栈的基本操作:
初始化栈:InitStack(&s)
销毁栈:DestoryStack(&L)
进栈:Push(&s,x)
出栈:Pop(&s,&x)
读栈顶元素:GetTop(s,&x)
判空栈:StackEmpty(S)
五、常考题型:
结论:n个不同元素进栈,出栈元素不同排列的个数为
六、顺序栈:
1.思维导图:
2.顺序栈基本操作的实现:
1.定义栈:
#define MaxSize 100
typedef struct{
int data[MaxSize]; //静态数组存放栈中元素
int top; //栈顶指针
}SqStack;
2. 初始化栈:InitStack(&s)
**ps:**初始化不同,判空、进栈、出栈判断条件都会不同。当S.top = 0时,小伙伴们自己思考一下
void InitStack(SqStack &S){
S.top = -1;
}
3.销毁栈:DestoryStack(&S)
bool DestoryStack(SqStack &S)
{
S.top = NULL;
return true;
}
4.进栈:Push(&s,x)
bool Push(SqStack &S,int x){
if(S.top == MaxSize-1)
return false;
//S.data[++S.top] = x;
S.top = S.top + 1;
S.data[S.top] = x;
return true;
}
5.出栈:Pop(&s,&x)
bool Pop(SqStack &S,int &x){
if(S.top == -1)
return false;
//x = S.data[S.top--];
x = S.data[S.top];
S.top = S.top - 1;
return true;
}
6.读栈顶元素:GetTop(s,&x)
bool GetTop(SqStack &S,int &x){
if(S.top == -1)
return false;
x = S.data[S.top];
return true;
}
7.判空栈:StackEmpty(S)
bool StackEmpty(SqStack S){
if(S.top == -1)
return true;
else
return false;
}
七、共享栈:
1.共享栈的定义
俩个栈共享同一片空间
2.顺序栈基本操作的实现:
1.定义栈:
#define MaxSize 100
typedef struct{
int data[MaxSize]; //静态数组存放栈中元素
int top0;
int top1;
}SqStack;
1.初始化栈:InitStack(&s)
void InitStack(SqStack &S){
S.top0 = -1;
S.top1 = MaxSize;
}
2.销毁栈:DestoryStack(&L)
bool DestoryStack(SqStack &S)
{
S.top0 = NULL;
S.top1 = NULL;
return true;
}
3.进栈:Push(&s,x)
//只演示其中一个栈
bool Push(SqStack &S,int x){
if(S.top0 + 1 == top1)
return false;
//S.data[++S.top] = x;
S.top = S.top + 1;
S.data[S.top] = x;
return true;
}
4.出栈:Pop(&s,&x)
//只演示其中一个栈
bool Pop(SqStack &S,int &x){
if(S.top0 == -1)
return false;
//x = S.data[S.top--];
x = S.data[S.top];
S.top = S.top - 1;
return true;
}
5.读栈顶元素:GetTop(s,&x)
bool GetTop(SqStack &S,int &x){
if(S.top0 == -1)
return false;
x = S.data[S.top0];
return true;
}
八、链栈:
1.思维导图:
2.链栈基本操作的实现:
1.定义链栈:
typedef struct Linknode{
int data;
struct Linknode *next;
} *LiStack;
2.
3.
4.
5.
6.
7.
九、栈的数学性质
n个不同元素进栈,出栈元素不同排列的个数为:1/(n+1)Cn2n