IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 06栈[数据结构学习笔记](注释比代码多) -> 正文阅读

[数据结构与算法]06栈[数据结构学习笔记](注释比代码多)

·相关概念

  1. 定义:限定只能在表的一端进行插入和删除运算的线性表(比如手电筒存取电池的操作)

  2. 逻辑结构:与线性表相同,仍为一对一关系。

  3. 存储结构:顺序栈和链式栈都可,但顺序栈更常用

  4. 运算规则:只能在栈顶运算,后进先出(LIFO)原则.与线性表不同(随机存取)。

·具体实现

顺序栈:

  1. 顺序栈的表示
#define MAXSIZE 100
typedef struct {
    int *base;   // 栈底指针
    int *top;    // 栈顶指针
    int stacksize;  // 栈可用最大容量
}SqStack;
  1. 顺序栈的初始化(即构造一个空栈)
Status InitStack(SqStack &S){
    S.base=(int*)malloc(MAXSIZE*sizeof(int));  // 为栈底指针开辟地址(malloc不再赘述)
    if(!S.base)exit(OVERFLOW);  // 如果base地址为0则表示没有分配成功
    S.top=S.base;   //栈顶指针等于栈底指针则为空栈
    S.stacksize=MAXSIZE; //栈的最大容量
    return OK;
}
  1. 顺序栈的清空与销毁
// 清空顺序栈
Status ClearStack(SqStack &S){
    if(S.base)S.top=S.base; //如果栈底不为空就令栈顶指针=栈底指针则为空栈
    return OK;
}

// 销毁顺序栈(与清空相比,将地址释放)
Status DestroyStack(SqStack &S){
    if(S.base){ //若是空栈则销毁
        delete S.base;
        S.stacksize=0;
        S.base=S.top=NULL;
    }
    return OK;
}
  1. 顺序栈的入栈

·算法思路:

  1. 判读是否栈满,若满则报错(上溢)
  2. 元素e压入栈顶指针
  3. 指针++指向下一元素
//  顺序栈的入栈
Status Push(SqStack &S, int e){
    if(S.top-S.base==S.stacksize) return ERROR;   //判读栈满
    *S.top=e;   //将元素e填入栈此时的顶部
    S.top++;    //让指针加1表示指向下一空间
    return OK;
}
  1. 顺序栈的出栈

·算法思路:

  1. 判断是否栈空,若空则报错(下溢)
  2. 获取栈顶元素,用e返回其指
  3. 栈顶指针–指向下一元素
// 顺序栈的出栈
Status Pop(SqStack &S, int &e){
    if(S.top==S.base) return ERROR; //判断是否为空栈
    S.top--;    //令top指向栈顶元素
    e=*S.top;
    return OK;
}

链栈:

概念:链栈是元素受限的单链表,只能在链表头部进行操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4MbsaaY4-1639484159377)(img.png)]

注意(一般情况下):
· 链表的头指针就是栈顶,不需要头结点
· 基本不存在栈满的情况
· 空栈相当于头指针指向空

  1. 链栈的结点定义:
// 链栈的结点
typedef struct StackNode{
    int data;
    struct StackNode *next; //嵌套定义
}StackNode,*LinkStack;
  1. 链栈的初始化
// 链栈的初始化(构建空栈)
Status InitStack(LinkStack &S){
    S=NULL;
    return OK ;
}
  1. 链栈的入栈

·算法思路:

  1. 生成一个新结点p,并且p指针指向该结点
  2. 为新结点赋值
  3. 让S指向新的栈顶
// 链栈的入栈
Status Push(LinkStack &S, int e){
    StackNode *p;   //定义指向p结点的指针
    p = (LinkStack) malloc(sizeof(LinkStack));//开辟新结点
    p->data=e;  
    p->next=S;
    S=p;
    return OK;
}
  1. 链栈的出栈

·算法思路:

  1. 判断是否栈空,若空则报错(下溢)
  2. 获取栈顶元素,用e返回其值
  3. 栈顶指针–指向下一元素
// 链栈的出栈
Status Pop(LinkStack &S,int &e){
    if(S==NULL) return ERROR;   //  判断是否为空
    e = S->data;    // 获取栈顶元素的指,e返回其值
    StackNode *p;   //定义指向p结点的指针
    p = S;          //让结点指针p指向出栈的结点,以便删除
    S=S->next;      //栈顶指针指向下一个元素
    delete p;   //将空结点删除释放空间
    return OK;
}

5.取栈顶元素的值

int GetTop(LinkStack S){
    if(S!=NULL)
        return S->data;
}

栈与递归

递归的定义:

  1. 对象递归: 若一个对象包含它自己,或用它自己给自己定义,则这个对象是递归的。
  2. 过程递归: 若一个过程直接或间接的调用自己,则为过程递归

递归的用途:

  1. 定义数学函数:阶乘等
  2. 具有递归特性的数据结构:二叉树,广义表
  3. 递归求解问题:迷宫问题,汉诺塔问题

递归问题----用分治法求解

一般形式如下:

void p(参数){
    if(递归结束条件) 可直接求解步骤;----基本项
    else p(较小参数);----归纳项
}

在这里插入图片描述

// 递归求阶乘
int DiGuDemo(int n){
    if(n==1) return 1;
    else n*=DiGuDemo(n-1);
}

在这里插入图片描述

递归的优缺点

优点:结构清晰,程序易读
缺点:每次调用要生成工作记录,保存状态信息,入栈;返回时要出栈,恢复状态信息,时间开销大。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-15 18:33:00  更:2021-12-15 18:34:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 16:58:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码