论:栈

2023-11-04

前言:本文从栈的定义开始,根据栈的两种存储结构,顺序和链式,分别实现栈的基本操作。

栈的定义

  栈——只允许通过访问它的一端来实现数据存储和检索的一种线性数据结构。即从固定一端插入数据、删除数据,后插入的先出,先插入的后出,因此,栈也称为(Last In First Out, LIFO)后进先出的线性表。栈中做插入和删除的一端作为栈顶(Top),另一端为栈底(Bottom)。
          栈结构

栈的基本操作
  1. 初始化栈 initStack():初始化栈顶指针和栈空间值
  2. 判断栈是否为空 isEmpty():判断当前栈空间是否为空,即 top == -1 是返回真,否返回假
  3. 判断栈空间是否已满 isFull():每个元素入栈前,都需要判断栈空间是否已满,若已满,则元素不入栈
  4. 入栈 Push():将元素加入栈顶,并且更新栈顶指针,入栈前需判断栈是否已满
  5. 出栈 Pop():将栈顶元素从栈中弹出,并且更新栈顶指针
  6. 读栈顶元素 getTopValue():读取栈顶元素的值
顺序栈实现

  使用一固定大小的数组来实现栈的顺序存储,也叫顺序栈。栈空间的容量有限,当某个元素入栈时先要判断栈空间是否够用,如果栈满,则元素不能入栈,否则会导致栈溢出。下面程序模拟元素入栈、出栈、读栈等基本操作。

// 栈的C语言数组实现
#include <stdio.h>
#include <string.h>
#define MAXSIZE 10
typedef struct {
    char data[MAXSIZE];
    int top;
}Stack;

Stack St;
void initStack(Stack *S) {
    S -> top = -1;
    memset(S -> data, 0, MAXSIZE);
}
int isFull(Stack *S) {
    return (S -> top == MAXSIZE - 1) ? 1 : 0; 
}
int isEmpty(Stack *S) {
    return (S -> top == -1) ? 1 : 0;
}
void Push(Stack *S, char ch) {
    S -> top ++;
    S -> data[S -> top] = ch;
    printf("%d 号元素 %c 入栈!\n", S->top, ch);
}
void Pop(Stack *S) {
    S -> top --;
}
char getTopValue(Stack *S) {
	return S -> data[S -> top];
}
int main() {
    char str[20] = {0};
    printf("输入一组字符,按 Enter 键结束\n");
    fgets(str, 20, stdin);
    initStack(&St);
    char *p = str;
    while(*p != '\0') {
        if(isFull(&St)) {
            printf("栈空间已满!\n");
            break;
        }
        else {
            Push(&St, *p);
        }
        p++;
    }
    printf("########## 入栈结束 ##########\n");
    while(!isEmpty(&St)) {
        printf("%d 号元素 %c 出栈!\n", St.top, getTopValue(&St));
        Pop(&St);
    }
    if(isEmpty(&St)) {
        printf("当前栈为空 top = %d\n", St.top);
        printf("########## 出栈结束 ##########\n");
    }
    return 0;
}

执行结果如下:该顺序栈最多存储10个字符,栈满则入栈结束
顺序栈

链式栈实现

  使用链表实现栈的链式存储,也叫链栈。因为栈的元素的插入和删除仅在栈顶端进行,因此链表的头指针即作为栈顶指针。
  以下栈的链表实现代码,模拟栈的入栈、出栈、读栈顶操作,栈的初始化由申请栈元素空间时完成,通过 pushFlag 标识符判断是否开始入栈,返回值 top 更新栈顶指针。

// 栈的C语言链表实现
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXSIZE 20

typedef struct stack {
    char data;
    struct stack *next;
}Stack;
Stack *Push(Stack *top, char ch, int *pushFlag) {
    
    if(*pushFlag == 0) {
        top -> data = ch;
        *pushFlag = 1;
    }
    else {
        Stack *st = (Stack *)malloc(sizeof(Stack));
        st -> data = ch;
        st -> next = NULL;
        st -> next = top;
        top = st;
    }
    printf("元素 %c 已入栈!\n", top -> data);
    return top;
}
Stack *Pop(Stack *top) {
    Stack *tmp = top;
    top = top -> next;
    free(tmp);
    tmp = NULL;
    return top;
}
char getTopValue(Stack *top) {
    return top -> data;
}
int main() {
    Stack *top = (Stack *)malloc(sizeof(Stack));
    top -> next = NULL;
    char str[MAXSIZE] = {0};
    int pushFlag = 0;
    printf("输入一组字符,按 Enter 键结束\n");
    fgets(str, MAXSIZE, stdin);
    int i;
    for(i = 0; str[i] != '\n'; i++) {
        top = Push(top, str[i], &pushFlag);
    }
    printf("########## 入栈结束 ##########\n");
    while(top != NULL) {
        printf("栈顶元素: %c\n", getTopValue(top));
        top = Pop(top);
    }
    printf("########## 出栈结束 ##########\n");
    return 0;
}

程序执行过程如下:
链表栈实现

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

论:栈 的相关文章

随机推荐

  • PyCharm软件破解使用方法

    背景 PyCharm的破解方法有很多种 第一种是 授权服务器激活 第二种是 激活码激活 第三种是 破解补丁激活 本文针对第三种 破解补丁激活 给出有效的破解方法 准备工具 PyCharm破解补丁这个肯定是需要的 下载链接 PyCharm破解
  • mysql设置用户权限

    1 创建用户 CREATE USER username host IDENTIFIED BY password 2 程序中使用的mysql账号应该遵循最小权限原则 不允许夸库查询 故设置专门的账号供程序使用 grant select upd
  • 攻防兼备:中国蚁剑使用指南及特征流量

    中国蚁剑是菜刀的升级版本 线现下主流的Webshell连接工具之一 有着较广泛的使用 本篇文章会教给大家蚁剑的使用方法以及不同加密方式的流量特征 兼顾攻防两端 蚁剑下载安装参考 中国蚁剑 antSword 下载 安装 使用教程 蚁剑下载 攀
  • 微信开放平台【第三方平台】java开发总结:第三方平台授权流程说明(authorization_code)(四)

    第三方平台授权流程说明 全网最详细的微信第三方平台授权公众号 小程序开发说明 参考文档地址 ttps developers weixin qq com doc oplatform Third party Platforms Authoriz
  • 没有产品说明书时使用的测试——探索测试

    探索测试 Exploratory Testing 通常用于没有产品说明书的测试 这需要把软件当作产品说明书来看待 分步骤逐项探索软件特性 记录软件执行情况 详细描述功能 综合利用静态和动态技术来进行测试 探索测试人员只靠智能 洞察力和经验来
  • 3D游戏编程与设计作业5——简易打飞碟游戏

    一 作业要求 1 编写一个简单的自定义 Component 用自定义组件定义几种飞碟 做成预制 2 编写一个简单的鼠标打飞碟游戏 内容要求 游戏有多个轮次 每个轮次都包括10个轨迹 每个轨迹的飞碟的色彩 大小 发射位置 速度 角度 同时出现
  • 永洪BI助力矿产行业数智化转型

    北路智控携手永洪BI 助力矿产行业数智化转型 南京北路智控科技股份有限公司 301195 SZ 成立于2007年 总部位于南京市江宁滨江经济技术开发区 是一家专业从事矿山自动化 信息化 智能化等产品的设计 研发 生产 销售及服务为一体的高新
  • 主动扫描系列文章(3):nmap与masscan的配合使用

    20201103 目录 主动扫描系列文章 1 nmap的基础使用 主动扫描系列文章 2 masscan zmap扫描主机与端口 主动扫描系列文章 3 nmap与masscan的配合使用 0 引言 注 本篇文章中的工具并未实际测试 只是前期工
  • MySQL必知必会——第十六章创建高级联结

    创建高级联结 本章将讲解另外一些联结类型 包括它们的含义和使用方法 介绍如何对被联结的表使用表别名和聚集函数 使用表别名 第十章 MySQL必知必会 第十章创建计算字段 介绍了如何使用别名引用表列 mysql gt SELECT Conca
  • 股市股票基金市场研报合集(2022年,共195份)

    合集名称 股市股票基金市场研报合集 数量 195份 具体内容 股票基金市场 2021Q4公募基金及陆股通持仓分析 内外资加仓成长 减持消费 周期 20220125 华安证券 42页 pdf 股票基金市场 2021Q4公募基金持股分析 风险偏
  • php 微信分享好友朋友圈自定义标题 描述和图片 报错 63002,invalid signature

    之前搞过一次一直没有记录 导致这次操作的时候有点吃力报错 一直给我报错63002 invalid signature 记得第一次搞的时候很快啊 这次卡了几个小时时间去排查 首先我们要根据微信官方文档排查 确定不是自己参数问题 进入官方文档
  • C#笔记2——如何实现treeview的单击功能

    C 笔记2 如何实现treeview的单击功能 近来做了一个课设 需要使用treeview 并且实现treeview的单击效果 翻了几本教材 都没有具体说如何实现该功能 于是乎各种问度娘 在多次的尝试之下终于实现类单击功能 下面来详细讲解一
  • 乌班图linux分辨率不能调,ubuntu18.04 分辨率设置(双屏幕显示,添加没有的分辨率)...

    时间 2019 03 13 作者 魏文应 要解决什么问题 通过本文 你能够实现类似于以下的效果 给电脑接两个显示器 分别是独立显卡 nvidia 和集成显卡 独立显卡通过 DVI 接口和显示器连接 选择 拼接显示器 选项 扩展显示 ubun
  • mate30升级鸿蒙系数据会被清空吗,145直接升级鸿蒙会不会掉资料

    分享交流 145直接升级鸿蒙会不会掉资料 18919 电梯直达 中二的灵魂 略有小成 发表于 2020 12 19 06 58 28 来自 HUAWEI Mate 30 5G 最新回复 2020 12 19 10 59 19 如题 有升了的
  • 数据结构课程设计c语言运动会管理系统

    参加运动会的有n个学院 学校编号为1 n 比赛分成m个男子项目 和w个女子项目 项目编号为男子1 m 女子m 1 m w 不同的项目取前八名积分 且前八名的积分分别为 9 7 6 5 4 3 2 1 m lt 20 n lt 20 功能要求
  • 【操作系统】王道考研 p46 页面分配策略

    页面分配策略 知识总览 驻留集 页面分配 置换策略 驻留集 给进程分配的物理块的集合 分配小了装不下 会频繁缺页中断 分配大了 给一个进程分配多了物理块 别的进程就少了 并发性下降 全局置换 把空闲的分给缺页进程 或把别的进程持有的物理块置
  • win11与Ubuntu 20.04 WSL进行文件互换

    WSL有一个很大的优点就是支持与Windows文件系统的互操作 可以访问和处理Windows文件系统中的文件 从而方便用户在Windows和Linux之间共享数据 通过WSL子系统终端访问Windows系统文件 在WSL中 Windows文
  • 关于redirect重定向的使用以及和二维码的结合

    redirect叫做重定向 重定向其实就是最后跳转是靠浏览器去跳转的 对比的就是转发 所有的跳转都是有web服务器来跳转 上面这个图说的不全面 因为除了页面 接口请求也是可以跳转的 比如请求接口1 接口1返回一个接口2 浏览器重定向接口2
  • 函数隐藏

    1 函数隐藏 派生类中函数名字与基类的成员函数名字相同时 派生类的成员函数会屏蔽基类中同名的成员函数 派生类中的成员变量与基类的成员变量同名时 派生类中的成员变量会屏蔽基类中同名的成员变量 如果要使用的话要加作用域 通过派生类对象 指针 引
  • 论:栈

    前言 本文从栈的定义开始 根据栈的两种存储结构 顺序和链式 分别实现栈的基本操作 目录 栈的定义 栈的基本操作 顺序栈实现 链式栈实现 栈的定义 栈 只允许通过访问它的一端来实现数据存储和检索的一种线性数据结构 即从固定一端插入数据 删除数