数据结构与算法--栈与队列

一、栈

  1. 定义:只允许一端进行插入和删除的线性表,结构与手枪的弹夹差不多,可以作为实现递归函数(调用和返回都是后进先出)调用的一种数据结构;
    • 栈顶:允许插入删除的那端;
    • 栈底:固定的,不允许插入或删除;
    • 空栈:不含元素;
  2. 特点:后进先出
  3. 操作:入栈(push)、出栈(pop)
  4. 应用:递归、进制转换、迷宫求解、括号匹配。
  5. 栈的顺序存储(顺序栈)
    • 定义:利用一组地址连续的存储单位存放自栈底到栈顶的数据元素,同时用一指针指示栈顶位置;
    • 栈顶指针:S.top,初始值=-1,栈顶元素S.data[S.top]
    • 进栈操作:栈不满时,栈顶指针+1,再送栈到栈顶元素
    • 出栈操作:栈非空时,先取栈顶元素值,再将栈顶指针-1
    • 栈空条件:S.top=-1;栈满条件:S.top==MaxSize-1;栈长:S.top+1
  6. 共享栈
    • 定义:两共享栈共享一个一维数组空间,两个栈顶指针都指向栈顶元素,top=-1时0号栈为空,top1=MaxSize时1号栈为空;当两栈指针相邻top1-top0=1时,满栈;共享栈是为了更好的利用存储空间,两个栈的空间相互调节,只有整个存储空间都被占满时才发生上溢。

  7. 链栈
    • 定义:采用链式存储的栈,便于多个栈共享存储空间和提高效率,且不存在栈满上溢问题,采用单链表实现,所有操作都在单链表表头进行,操作与链表相似

二、队列

  1. 定义:简称队,一种操作受限制的线性表,只允许在表的一端插入,在表另一端删除。
    • 队头:允许删除的一端,队头指针指向队头元素;
    • 队尾:允许插入的一端,队尾指针指向队尾元素下一个位置;
    • 空队列:无元素 ;
    • 初始条件(队空条件):Q.front==Q.rear==0,front队头,rear队尾;
    • 假溢出:一维数组队列的尾指针已达到数组上界,不能入队,其实数组中还有空位置;
  2. 特点:先进先出(怎么进怎么出)
  3. 应用:缓冲区、页面替换算法;
  4. 操作:进队(队不满时,先送值到队尾元素,队尾指针+1);出队(队不空时,先取队头元素值,队头指针+1);
  5. 循环队列:把存储队列元素的表从逻辑上看成一个环,循环队列的引入是为了防止假溢出;                                                                       

    • 初始时:Q.front=Q.rear=0;
    • 队首指针进1(出队):Q.front=(Q.front+1)%MaxSize;
    • 队尾指针进1(入队):Q.rear=(Q.rear+1)%MaxSize;
    • 队列长度(队列中元素个数):(Q.rear-Q.front+MaxSize)%MaxSize【(尾-头+M)%M】;
    • 队空:Q.front==Q.rear==0;
    • 队满:(Q.rear+1)%MaxSize==Q.front;
    • 出队入队指针按顺时针进1;
    • 例题:循环队列存储在数组A[0...n]中,则入队操作为rear=(rear+1)mod(n+1)。
  6. 链队列:同时带队头指针和队尾指针的单链表,无假溢出现象;

  7. 双端队列:允许两边都可以入队和出队。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值