2022王道考研数据结构笔记--第三章 栈和队列

第三章 栈和队列

3.1栈(Stack)

3.1.1 栈的基本概念

  1. 栈的定义
  • 栈是特殊的线性表:只允许在一端进行插入或删除操作的线性表, 其逻辑结构与普通线性表相同;数据的运算:插入删除操作有区别;
  • 栈顶:允许进行插入和删除的一端 (最上面的为栈顶元素);
  • 栈底:不允许进行插入和删除的一端 (最下面的为栈底元素);
  • 空栈:不含任何元素的空表;
  • 特点:后进先出 Last in firsr Out(LIFO)(后进栈的元素先出栈);
  • 缺点:栈的大小不可变,解决方法——共享栈;
  1. 栈的基本操作 (运算)

"创&销"

  • InitStack(&S) 初始化栈:构造一个空栈S,分配内存空间;
  • DestroyStack(&S) 销毁栈:销毁并释放栈S所占用的内存空间;

"增&删"

  • Push(&S, x) 进栈:若栈S未满,则将x加入使其成为新栈顶;
  • Pop(&S, &x) 出栈:若栈S非空,则弹出(删除)栈顶元素,并用x返回;

"查&其他"

  • GetTop(S, &x) 读取栈顶元素:若栈S非空,则用x返回栈顶元素;(栈的使用场景大多只访问栈顶元素);
  • StackEmpty(S)判空: 判断一个栈S是否为空,若S为空,则返回true,否则返回false
  1. 栈的常考题型
  • 给个进栈顺序,判断有哪些合法的出栈顺序;

例:进栈顺序为:a -> b -> c -> d -> e

合法的出栈顺序:e d c b a / b e d c a (出栈和进栈交替进行) / …

结论

在这里插入图片描述
在这里插入图片描述

3.1.2 栈的顺序存储

  1. 顺序栈的定义
    采用顺序存储的栈称为顺序栈,它利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示当前栈顶的位置。
#define MaxSize 10         //定义栈中元素的最大个数

typedef struct{
   
    ElemType data[MaxSize];       //静态数组存放栈中元素
    int top;                      //栈顶元素
}SqStack;

void testStack(){
   
    SqStack S;       //声明一个顺序栈(分配空间)
                     //连续的存储空间大小为 MaxSize*sizeof(ElemType)
}

  • 栈顶指针:S.top,初始值 s.top=-1;栈顶元素:S.data[S.top];
  • 进栈操作:栈不满时,栈顶指针先加 1 ,再赋值;
  • 出栈操作:栈非空时,先取栈顶元素值,再将栈顶指针减 1;
  • 栈空:S.top==-1;
  • 栈满:S.top==MaxSize -1;
  • 栈长:S.top+1;
  1. 顺序栈的基本操作
#define MaxSize 10         //定义栈中元素的最大个数

typedef struct{
   
    ElemType data[MaxSize];       //静态数组存放栈中元素
    int top;                      //栈顶元素
}SqStack;

//初始化栈
void InitStack(SqStack &S){
   
    S.top = -1;                   //初始化栈顶指针
}

//判栈空
bool StackEmpty(SqStack S){
   
    if(S.top == -1)      //栈空
        return true;
    else                 //栈不空
        return false;
}

//新元素进栈
bool Push(SqStack &S, ElemType x){
   
    if(S.top == MaxSize - 1)        //栈满
        return false;
    
    S.top = S.top + 1;    //指针先加1
    S.data[S.top] = x;    //新元素入栈

    /*等价于
    S.data[++S.top] = x;
    */
    return true;
}

//出栈
bool Pop(SqStack &x, ElemType &x){
   
    if(S.top == -1)          //栈空,报错
        return false;
    
    x = S.data[S.top];       //栈顶元素先出栈
    S.top = S.top - 1;       //栈顶指针减1
    return true;

    /*
    x = S.data[S.top--];
    */

    //只是逻辑上的删除,数据依然残留在内存里

}

//读栈顶元素
bool GetTop(SqStack S, ElemType &x){
   
    if(S.top == -1)
        return false;
    
    x = S.data[S.top];      //x记录栈顶元素
    return true; 
}


void testStack(){
   
    SqStack S;       //声明一个顺序栈(分配空间)
    InitStack(S);
    //...
}

另一种方式: 也可以初始化时定义 S.top = 0 :即栈顶指针(top)指向栈顶元素的下一个位置;

  • 判空:if(S.top == 0)
  • 进栈使用:S.data[S.top++] = x;
  • 出栈使用:x = S.data[–S.top];
  • 判断栈满:s.top == MaxSize

顺序栈的缺点

  • 栈的大小不可变
  1. 共享栈
    两个栈共享同一片空间
#define MaxSize 10         //定义栈中元素的最大个数

typedef struct{
   
    ElemType data[MaxSize];       //静态数组存放栈中元素
    int top0;                     //0号栈栈顶指针
    int top1;                     //1号栈栈顶指针
}ShStack;

//初始化栈
void InitSqStack(ShStack &S){
   
    S.top0 = -
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值