ch3 栈和队列

P.S我们接触到新的数据结构类型,都应该从其逻辑结构存储结构和对数据的运算三个方面着手
栈和队列是两种重要的线性结构

抽象数据类型栈的的定义

栈(stack)是限定仅在表尾进行插入或删除操作的线性表,表尾端称为栈顶(top),表头端称为栈底(bottom)
栈又称为后进先出(last in first out)的线性表(简称LIFO结构)
这里写图片描述

栈的基本操作
  1. InitStack(&S): 初始化一个空栈S
  2. StackEmpty(S): 判断一个栈是否为空,若栈S为空返回true,否则返回false
  3. Push(&S, x): 进栈,若栈S未满,将x加入使之成为新栈顶;
  4. Pop(&S, &x): 出栈,若栈S非空,弹出栈顶元素,并用x返回;
  5. GetTop(S, &x): 读栈顶元素,若栈S非空,用x返回栈顶元素
  6. ClearStack(&S): 销毁栈,并释放栈S占用的存储空间

栈的表示和实现

typedef struct{
    SElemType *base;   //栈底指针
    SElemType *top;    //栈顶指针
    int stacksize;     //指示当前栈可使用的最大容量
}SqStack;

顺序栈

栈的顺序存储称为顺序栈
这里写图片描述
若栈顶指针初始化S.top=-1,则指针先加1,再入栈;先出栈,指针再减1
若栈顶指针初始化S.top=0,则先入栈,再指针加1;先指针减1,再出栈

链式栈

采用链式存储的栈称为链栈,通常采用单链表实现,并规定所有操作都是在单链表的表头进行。对于带不带头结点的链栈,在具体的实现方面有所不同。

对于n个不同的元素进栈,出栈序列的个数为:
这里写图片描述
上述公式叫做卡特兰(Catalan)数

栈与递归的实现

一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称做递归函数

n阶Hanoi问题

这里写图片描述

void hanoi(int n,char x,char y,char z)
//将塔座x上按直径由大到小且自上而下编号为1至n的n个圆盘按规则搬到
// 塔座z上,y可用作辅助塔座 
//搬动操作move(x,n,z)可定义为(c是初值为0的全局变量,对搬动计数):
//printf("%i. Move disk %i from %c to %c\n", ++c, n, x, z); 
{
    if(n==1)
        move(x,1,z);        //将编号为1的圆盘从x移到z
    else {
        hanoi(n-1,x,z,y);   //将x上编号为1至n-1的圆盘移到y,z作辅助塔 
        move(x,n,z);        //将编号为n的圆盘从x移到z 
        hanoi(n-1,y,x,z);   //将y上编号为1至n-1的圆盘移到z,x作辅助塔 
    } 
}

这里写图片描述
这里写图片描述
这里写图片描述

队列

队列(queue)是一种先进先出(first in first out,FIFO)的线性表
队头(Front):允许删除的一端,又称队首
队尾(Rear):允许插入的一端
这里写图片描述

队列常见的操作

  1. InitQueue(&Q):初始化队列
  2. QueueEmpty(Q):判断队列是否为空
  3. EnQueue(&Q, x):入队,若队列Q未满,将x加入,使之成为新的队尾
  4. DeQueue(&Q, &x):
  5. GetHead(Q, &x)
    初始状态(队空条件): Q.front==Q.rear==0;
    进队操作:队不满时,先送值到队尾元素,再将队尾加1
    出队操作:队不空时,先取队头元素值,再将队头指针加1

入队出现上溢出,但队列中仍然存在可以存放元素的孔位置,产生假溢出
这里写图片描述

双端队列(deque)

是限定插入和删除操作在表的两端进行的线性表。也有输入受限的双端队列或输出受限的双端队列
这里写图片描述

队列的链式存储结构

队列的链式表示为链队列。
这里写图片描述

循环队列

把存储队列元素的表从逻辑上看成一个环,称为循环队列
初始时:Q.front=Q.rear=0
队首指针进1:Q.front=(Q.front+1)%MaxSize
队尾指针进1:Q.rear=(Q.rear+1)%MaxSize
队列长度:(Q.rear+MaxSize-Q.front)%MaxSize
这里写图片描述
为了区分队空还是队满的情况,有三种方式:
(1)牺牲一个单元区分队空和队满,入队时少用一个队列单元
队满条件为:(Q.rear+1)%MaxSize==Q.front
队空条件:Q.front==Q.rear
队列中元素的个数:(Q.rear-Q.front+MaxSize)%MaxSize
(2)类型中增设表示元素个数的数据成员,则队空的条件为Q.size==0;队满的条件为Q.size==MaxSize, 这两种情况都有Q.front==Q.rear
(3)类型中增设tag数据成员,以区分是队满还是队空,tag等于0的情况下,若因删除导致Q.front==Q.rear则为队空 ; tag等于1的情况下 , 若因插入导致Q.front==Q.rear则为队满。

特殊矩阵的压缩存储

压缩存储:指为多个值相同的元素只分配一个存储空间,对零元素不分配存储空间是为了节省存储空间
特殊矩阵:指具有许多相同矩阵元素或零元素,并且这些相同矩阵元素或零元素的分布有一定规律性的矩阵;常见的特殊矩阵有对称矩阵,上(下)三角矩阵,对角矩阵等
特殊矩阵的压缩存储方法:找出特殊矩阵中值相同的矩阵元素的分布规律,把那些呈现规律性分布的值相同的多个矩阵元素压缩存储到一个存储空间中

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值