数据结构——栈

164 阅读2分钟

这是我参与更文挑战的第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在遍历从根结点到目标结点的路径的过程中,只有到达最深的节点才会回溯,而栈始终会保存“正在被使用”的结点。只有在回溯发生时,栈才会弹出该结点。