数据结构学习笔记(第三章 栈,队列和数组)

目录

​编辑

一、栈

1.定义

2.基本操作(严蔚敏版)

 3.栈的顺序存储结构

顺序栈的实现

栈的基本运算

 共享栈

 4.栈的链式存储

 二、队列

1.定义

2.基本操作

 3.队列的顺序存储

循环队列

4.队列的链式存储结构

基本操作

 5.双端队列

 三、数组

 1.定义

2.特殊矩阵的压缩存储


 

一、栈

1.定义

栈是只允许在一端进行插入和删除操作的线性表。

栈顶线性表允许插入删除的一端。

栈底:固定的,不允许插入删除的另一端。

空栈:不含任何元素的空表。

栈的特性:符合后进先出算法(Last In First Out ,LIFO)

2.基本操作(严蔚敏版)

 3.栈的顺序存储结构

顺序栈的实现

栈顶指针:S.top,初始时设置为S.top=-1;栈顶元素:S.data[S.top]

进栈:栈不满时,栈顶指针先加一,再送值到栈顶元素。

出栈:栈非空时,先取栈顶元素值,再将栈顶指针减一。

栈空条件: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;
    else
        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;
}

 共享栈

 4.栈的链式存储

简称为链栈优点:便于多个栈共享存储空间和提高其效率,且不存在栈满上溢情况,多为单链表实现,并且所有操作都在规定在表头进行,下面就来示范一种不带头结点的:

 二、队列

 

1.定义

 一种操作受限的线性表,只允许在表的一端进行插入,另一端进行删除。

特性:先进先出(FIFO)

队头(front):允许删除的一端,又成队首

队尾(rear):允许插入一端

空队列:不含任何元素的空表。

2.基本操作

 3.队列的顺序存储

 

 上图分别为空队,5个元素入队,出队一次,和出队三次(从左到右)

循环队列

原理

用除法取余运算来实现

 为了区分队空和队满,有三种处理方式:

1.牺牲一个单元来区分队空和队满

队满条件:(Q.rear+1)%MaxSize==Q.front

队空条件:Q.front==Q.rear

队列中元素个数:(Q.rear-Q.front+MaxSize)%MaxSize

2.类型中增设表示元素个数的数据成员。这样队空的条件为Q.size==0,队满为Q.size==MaxSize

3.增设tag数据成员。

tag等于0时,若因删除导致Q.front==Q.rear,则为队空。

tag等于1时,若因插入导致Q.front==Q.rear,则为队满。

循环队列基本操作

初始化
void InitQuene(SqQuene &Q){
    Q.rear=Q.front=0;
}

判空
bool isEmpty(SqQuene Q){
    if(Q.rear==Q.front)
        return true;
    else
        return false;
}
入队
bool EnQuene(SqQuene &Q,ElemType x){
    if((Q.rear+1)%MaxSize==Q.front)
        return false;//队满则报错
    Q.data[Q.rear]=x;
    Q.rear=(Q.rear+1)%MaxSize;
        return true;
}
出队
bool DeQuene(SqQuene &Q,ElemType &x){
    if(Q.rear==Q.front)
        return false;
    x=Q.data[Q.front];
    Q.front=(Q.front+1)%MaxSize;
        return true;
}

4.队列的链式存储结构

简称 链队列。实际上是一个同时带有队头指针和队尾指针的单链表。

 

存储类型如上。

由上述资料得出,我们推荐使用带头结点的单链表来表示队列。

基本操作

 5.双端队列

允许两端都进行入队和出队操作,逻辑结构仍为线性结构。分别有前端和后端。

下面是受限的情况

 三、数组

 1.定义

n个相同数据类型的数据元素构成的有限序列,每个元素的序号成为下标,下标的取值范围成为维界。

数组是线性表的推广,一维数组可视为线性表,二维数组可视为其元素也是定长线性表的线性表。数组一旦被定义,其维数和维界就不再改变。

 对于多维数组,有两种映射方式:按行优先和按列优先。

2.特殊矩阵的压缩存储

 1.对称矩阵 2.三角矩阵 3.对角矩阵 4.稀疏矩阵

这里描述太多了,基本数学中咱都学过,就不再多加描述了。 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

低调$(生活)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值