这是我参与更文挑战的第12天,活动详情查看:更文挑战
栈
只允许在一端进行插入或删除操作的线性表
- 栈顶:线性表允许插入或删除的那一端
- 栈底:固定的,不允许进行从插入和删除的那一端
- 空栈:不包含任何元素的空表
基本操作
初始化 判断是否为空 进栈 出栈 读栈顶元素 销毁栈
栈的顺序实现
#define MaxSize 50
typedef struct{
Elemtype data[MaxSize];//存放栈中元素
int top; //栈顶指针
} SqStack;
- 栈顶指针:S.top 初始时设置S.top = -1栈顶元素 S.data[S.top]
- 进栈操作:栈不满时,栈顶指针先加1,再送值到栈顶元素
- 出栈操作:栈非空时,先取栈顶元素值,再将栈顶指针减1
- 栈空条件:S.top ==-1栈满条件S.top == MaxSize-1;栈长S.top+1
//初始化
void InitStack(SqStack &S){
S.top = -1;
}
bool StackEmpty(SqStack S){
if(S.top == -1)return true;
return false;
}
// 进栈
bool Push(SqStack &S, ElemType x){
if(S.top == MaxSize -1)return false;
S.data[++S.top] = x;
return true;
}
//出栈
bool Pop (SqStack &s,ElemType &x){
if(S.top == -1)return false;
x = s.data[s.top--];
return true;
}
//读栈顶元素
bool GetTop(SqStack S,ElemType &x){
if(S.top == -1)return false;
x = S.data[S.top];
return true;
}
存取数据时间复杂度O(1)
栈的链式实现
typedef struct Linknode{
ElemType data;
struct Linknode *next;
}*LiStack;
栈的作用
我们都知道栈的特点是先进后出,那么栈一般会在哪里被使用呢?
汉诺塔,表达式求值,使用栈实现队列
这是三个必会的考点了,一般公司不要求算法的话不会出比这还难的考题。
需要注意的是,我们可以通过栈来实现一个不需要递归的深度优先搜索。
dfs的特点是:除非我们到达最深的结点,否则我们永远不会回溯 。
这和我们栈的特点不谋而合。
dfs在遍历从根结点到目标结点的路径的过程中,只有到达最深的节点才会回溯,而栈始终会保存“正在被使用”的结点。只有在回溯发生时,栈才会弹出该结点。