数据结构(c语言版) 栈

顺序栈

要求:实现顺序栈的入栈,出栈,显示栈

代码

#include <stdio.h>
#define MAXSIZE 100

struct liststack{
    int data[MAXSIZE];
    int top;
};

//初始化栈
void init(struct liststack * LS){
    LS->top = -1;
}

//入栈操作
void instack(struct liststack * LS, int value){
    //判断是否栈满
    if(LS->top == (MAXSIZE-1)){
        printf("入栈失败:栈满!\n");
        return;
    }
    //入栈
    LS->top ++;
    LS->data[LS->top] = value;
    printf("数据 %d 入栈成功,在第 %d 位\n", value, LS->top+1);
}

//出栈操作
void outstack(struct liststack * LS){
    //判断是否栈空
    if(LS->top == -1){
        printf("出栈失败:栈空!\n");
        return;
    }
    //出栈
    printf("第 %d 位数据为 %d 出栈成功!\n",LS->top+1 , LS->data[LS->top]);
    LS->top --;
}

//显示栈的数据
void isstack(struct liststack * LS){
    //判断是否栈空
    if(LS->top == -1){
        printf("显示栈失败:栈空!\n");
        return;
    }
    int index = LS->top;
    while(index != -1){
        printf("第 %d 位数据是 %d \n",index + 1, LS->data[index]);
        index --;
    }
}

//判断栈
int emptystack(struct liststack * LS){
    if(LS->top == -1){
        printf("栈为空栈\n");
        return 1;
    }

    if(LS->top == (MAXSIZE-1)){
        printf("栈为满栈\n");
        return 0;
    }

    printf("既不是空栈,也不是满栈\n");
    return 2;

}


int main(){
    struct liststack LS;
    init(&LS);

    printf("****************入栈操作****************\n");
    int value;
    printf("请输入入栈的数据(输入0则结束):");
    scanf("%d", &value);
    while (value != 0){
        instack(&LS, value);
        printf("请输入入栈的数据(输入0则结束):");
        scanf("%d", &value);
    }

    printf("\n****************显示栈中数据****************\n");
    isstack(&LS);

    printf("\n****************出栈操作****************\n");
    int flag;
    printf("出栈请输入1,结束请输入0:");
    scanf("%d", &flag);
    while (1){
        if(flag == 1){
            outstack(&LS);
        }
        if(flag == 0){
            break;
        }
        printf("出栈请输入1,结束请输入0:");
        scanf("%d", &flag);
    }

    printf("\n****************显示栈中数据****************\n");
    isstack(&LS);

    printf("\n****************判断栈****************\n");
    emptystack(&LS);
}

运行结果

****************入栈操作****************
请输入入栈的数据(输入0则结束):10
数据 10 入栈成功,在第 1 位
请输入入栈的数据(输入0则结束):20
数据 20 入栈成功,在第 2 位
请输入入栈的数据(输入0则结束):304
数据 304 入栈成功,在第 3 位
请输入入栈的数据(输入0则结束):450
数据 450 入栈成功,在第 4 位
请输入入栈的数据(输入0则结束):596
数据 596 入栈成功,在第 5 位
请输入入栈的数据(输入0则结束):0

****************显示栈中数据****************5 位数据是 5964 位数据是 4503 位数据是 3042 位数据是 201 位数据是 10

****************出栈操作****************
出栈请输入1,结束请输入015 位数据为 596 出栈成功!
出栈请输入1,结束请输入014 位数据为 450 出栈成功!
出栈请输入1,结束请输入00

****************显示栈中数据****************3 位数据是 3042 位数据是 201 位数据是 10

****************判断栈****************
既不是空栈,也不是满栈

进程已结束,退出代码为 0

链栈

实现链栈的创建,入栈,出栈,显示栈

代码

#include <stdio.h>
#include <malloc.h>

struct linkstack{
    int data;
    struct linkstack * next;
};

//初始化栈
void init(struct linkstack * LS){
    LS->next = NULL;
}

//判断栈
int emptystack(struct linkstack * LS){
    if(LS->next == NULL){
        printf("栈为空栈\n");
        return 0;
    }
    printf("栈不是空栈\n");
    return 1;
}

//入栈  头插法
void instack(struct linkstack * LS, int value){
    if(LS == NULL){
        printf("栈不存在\n");
        return;
    }

    struct linkstack * NewNode = malloc(sizeof(struct linkstack));
    if(NewNode){
        NewNode->data = value;
        NewNode->next = LS->next;
        LS->next = NewNode;
        printf("数据 %d 入栈成功!\n", value);
    } else{
        printf("入栈失败!\n");
    }


};


//出栈
void outstack(struct linkstack * LS){
    if(LS->next == NULL){
        printf("出栈失败:栈为空!\n");
    }
    struct linkstack* temp = LS->next;
    LS->next = LS->next->next;
    printf("数据 %d 出栈成功!\n",temp->data);
    free(temp);
}

//显示栈
void isstack(struct linkstack * LS){
    if(LS->next == NULL){
        printf("显示栈失败:栈为空!\n");
    }
    int top = 1;
    struct linkstack* temp = LS->next;
    while(temp != NULL){
        printf("距栈顶第 %d 位的数据是 %d \n",top, temp->data);
        top ++;
        temp = temp->next;
    }
}

int main(){
    struct linkstack LS;
    init(&LS);

    printf("****************链栈入栈操作****************\n");
    int value;
    printf("请输入入栈的数据(输入0则结束):");
    scanf("%d", &value);
    while (value != 0){
        instack(&LS, value);
        printf("请输入入栈的数据(输入0则结束):");
        scanf("%d", &value);
    }


    printf("\n****************显示链栈中数据****************\n");
    isstack(&LS);

    printf("\n****************链栈出栈操作****************\n");
    int flag;
    printf("出栈请输入1,结束请输入0:");
    scanf("%d", &flag);
    while (1){
        if(flag == 1){
            outstack(&LS);
        }
        if(flag == 0){
            break;
        }
        printf("出栈请输入1,结束请输入0:");
        scanf("%d", &flag);
    }

    printf("\n****************显示链栈中数据****************\n");
    isstack(&LS);

    printf("\n****************判断链栈****************\n");
    emptystack(&LS);
}

运行结果

在这里插入图片描述

共享栈

要求:两栈共享技术

代码

#include <stdio.h>
#define MAXSIZE 100

//声明结构体
struct DListStack{
    int data[MAXSIZE];
    int top[2];
};

//初始化结构体
void init(struct DListStack* DLS){
    DLS->top[0] = -1;
    DLS->top[1] = MAXSIZE;
}

//入栈
void inDLStack(struct DListStack* DLS, int value, int i){
    //判断是否满栈
    if(DLS->top[0]+1 == DLS->top[1]){
        printf("入栈失败:栈满\n");
        return;
    }

    //判断在第几个栈 入栈
    if(i == 0){
        DLS->top[0]++;
        DLS->data[DLS->top[0]] = value;
        printf("数据 %d 在共享栈的第左栈中第 %d 位入栈成功\n",value, DLS->top[0]+1);
        return;
    }

    if(i == 1){
        DLS->top[1]--;
        DLS->data[DLS->top[1]] = value;
        printf("数据 %d 在共享栈的右栈中第 %d 位入栈成功\n",value, DLS->top[1]+1);
        return;
    }
    printf("入栈失败\n");
}

//出栈
void outDLStack(struct DListStack* DLS, int i){
    //判断是否满栈
    if(DLS->top[0] == -1 && DLS->top[1] == MAXSIZE){
        printf("出栈失败:两个栈都为空栈\n");
        return;
    }

    //判断在第几个栈 出栈
    if(i == 0){
        if(DLS->top[0] == -1){
            printf("出栈失败:左栈为空栈!\n");
            return;
        }
        printf("数据 %d 在共享栈的左栈中第 %d 位出栈成功\n",DLS->data[DLS->top[0]], DLS->top[0]+1);
        DLS->top[0]--;
        return;
    }

    if(i == 1){
        if(DLS->top[1] == -1){
            printf("出栈失败:右栈为空栈!\n");
            return;
        }
        printf("数据 %d 在共享栈的右栈中第 %d 位出栈成功\n",DLS->data[DLS->top[1]], DLS->top[1]+1);
        DLS->top[1]++;
        return;
    }
    printf("出栈失败\n");
}

//显示栈
void isDLStack(struct DListStack* DLS){
    //判断是否满栈
    if(DLS->top[0] == -1 && DLS->top[1] == MAXSIZE){
        printf("显示栈失败:两个栈都为空栈\n");
        return;
    }

    //显示第一个栈
    int index_0 = DLS->top[0];
    if(index_0 == -1){
        printf("显示栈失败:左栈为空栈!\n");
    }
    while (index_0 != -1){
        printf("数据 %d 在共享栈的左栈中第 %d 位出栈成功\n",DLS->data[index_0], index_0+1);
        index_0 --;
    }

    //显示第er个栈
    int index_1 = DLS->top[1];
    if(index_1 == MAXSIZE){
        printf("显示栈失败:右栈为空栈!\n");
    }
    while (index_1 != MAXSIZE){
        printf("数据 %d 在共享栈的右栈中第 %d 位出栈成功\n",DLS->data[index_1], index_1+1);
        index_1 ++;
    }

}

int main(){
    struct DListStack DLS;
    init(&DLS);

    printf("********************入栈操作***********************\n");
    int value,index;
    printf("请输入入栈的值和左(0)栈或者右(1)栈,输入2 2则结束:");
    scanf("%d %d",&value, &index);
    while (1){
        if(index == 0){
            inDLStack(&DLS, value, 0);
        }
        if(index == 1){
            inDLStack(&DLS, value, 1);
        }
        if(index == 2){
            break;
        }
        printf("请输入入栈的值和左(0)栈或者右(1)栈,输入2 2则结束:");
        scanf("%d %d",&value, &index);
    }

    printf("\n********************显示栈操作***********************\n");
    isDLStack(&DLS);

    printf("\n********************出栈操作***********************\n");
    int flag;
    printf("出左栈则输入0,出右栈则输入1,结束则输入2:");
    scanf("%d", &flag);
    while (1){
        if(flag == 0){
            outDLStack(&DLS, 0);
        }
        if(flag == 1){
            outDLStack(&DLS, 1);
        }
        if(flag == 2){
            break;
        }
        printf("出左栈则输入0,出右栈则输入1,结束则输入2:");
        scanf("%d", &flag);
    }

    printf("\n********************显示栈操作***********************\n");
    isDLStack(&DLS);

}

运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/125199.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git详解及常用命令

前言 Git 是一个分布式版本控制系统&#xff0c;用于跟踪和管理项目的代码变化。它由Linus Torvalds在2005年创建&#xff0c;现在是开源社区中最流行的版本控制工具之一。 国内码云地址&#xff1a;工作台 - Gitee.com 版本控制系统 (VCS)&#xff1a;Git 用于跟踪文件和目录…

yolov8+多算法多目标追踪+实例分割+目标检测+姿态估计(代码+教程)

多目标追踪实例分割目标检测 YOLO (You Only Look Once) 是一个流行的目标检测算法&#xff0c;它能够在图像中准确地定位和识别多个物体。 本项目是基于 YOLO 算法的目标跟踪系统&#xff0c;它将 YOLO 的目标检测功能与目标跟踪技术相结合&#xff0c;实现了实时的多目标跟…

MUYUCMS v2.1:一款开源、轻量级的内容管理系统基于Thinkphp开发

MuYuCMS&#xff1a;一款基于Thinkphp开发的轻量级开源内容管理系统&#xff0c;为企业、个人站长提供快速建站解决方案。它具有以下的环境要求&#xff1a; 支持系统&#xff1a;Windows/Linux/Mac WEB服务器&#xff1a;Apache/Nginx/ISS PHP版本&#xff1a;php > 5.6 (…

【c++】——类和对象(中)——赋值运算符重载

作者:chlorine 专栏:c专栏 你站在原地不动,就永远都是观众。 【学习目标】 拷贝复制——赋值运算符重载 目录 &#x1f393;运算符重载的初步认识 &#x1f308;运算符重载 &#x1f308;赋值运算符重载格式 (上) &#x1f308;operator__判断俩个日期是否相等 &#x…

【Shell脚本8】Shell printf 命令

Shell printf 命令 printf 命令模仿 C 程序库&#xff08;library&#xff09;里的 printf() 程序。 printf 由 POSIX 标准所定义&#xff0c;因此使用 printf 的脚本比使用 echo 移植性好。 printf 使用引用文本或空格分隔的参数&#xff0c;外面可以在 printf 中使用格式化…

SQL note1:Basic Queries + Joins Subqueries

目录 一、Basic Queries 1、数据库术语 2、查表 3、过滤掉我们不感兴趣的行 4、布尔运算 5、过滤空值&#xff08;NULL&#xff09; 6、分组和聚合 1&#xff09;汇总数据的列 2&#xff09;汇总数据组 7、分组聚合的警告 1&#xff09;SELECT age, AVG(num_dogs) FR…

代挂单页网址发布页+加盟代理+APP下载页源码

代挂单页加盟代理网址发布页app下载页HTML单页版本&#xff0c;自行修改源码内文字。自行修改联系方式、登录地址&#xff01;上传即可使用。源码我已全部打包好&#xff0c;直接上传本站提供的源码&#xff0c;无后台&#xff0c;直接访问即可&#xff01; 源码下载&#xff…

STM32外设系列—MPU6050角度传感器

&#x1f380; 文章作者&#xff1a;二土电子 &#x1f338; 关注公众号获取更多资料&#xff01; &#x1f438; 期待大家一起学习交流&#xff01; 文章目录 一、MPU6050简介二、MPU6050寄存器简介2.1 PWR_MGMT_1寄存器2.2 GYRO_CONFIG寄存器2.3 ACCEL_CONFIG寄存器2.4 PW…

到蒙古包了,这边天气-9度 很冷

【点我-这里送书】 本人详解 作者&#xff1a;王文峰&#xff0c;参加过 CSDN 2020年度博客之星&#xff0c;《Java王大师王天师》 公众号&#xff1a;JAVA开发王大师&#xff0c;专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生&#xff0c;期待你的…

lua脚本实现redis分布式锁(脚本解析)

文章目录 lua介绍lua基本语法redis执行lua脚本 - EVAL指令使用lua保证删除原子性 lua介绍 Lua 是一种轻量小巧的脚本语言&#xff0c;用标准C语言编写并以源代码形式开放&#xff0c; 其设计目的是为了嵌入应用程序中&#xff0c;从而为应用程序提供灵活的扩展和定制功能。 设…

(动手学习深度学习)第13章 计算机视觉---图像增广与微调

13.1 图像增广 总结 数据增广通过变形数据来获取多样性从而使得模型泛化性能更好常见图片增广包裹翻转、切割、变色。 图像增广代码实现

【开源三方库】Easyui:基于OpenAtom OpenHarmony ArkUI深度定制的组件框架

万冬阳 公司&#xff1a;中国科学院软件所 小组&#xff1a;知识体系工作组 简介 Easyui是一套基于ArkTS语言开发的轻量、可靠的移动端组件库&#xff0c;它是对OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09; ArkUI进行深度定制的组件框架。Easyui可扩…

C/C++特殊求和 2021年6月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C幻数求和 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C幻数求和 2021年6月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 如果一个数能够被7整除或者十进制表示中含有数字7&…

NVM安装使用

文章目录 简要说明下载nvm安装nvm使用说明使用nvm下载各个版本的node.js查看已经下载到本地的node有哪些切换到对应的node版本后 简要说明 当我们在项目开发时&#xff0c;我们接手别人的项目、是当时开发的项目使用的node版、找开源项目学习的时候开源项目要求的node版本。和…

【数据结构】线性表的链式存储结构

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 顺序存储结构的不足的解决办法 从上一节我们对顺序表的讨论中可见,线性表的顺序存储结构的特点是: 逻辑关系上相邻的两个元素在物理位置(内存)上也相邻,因此可以随机存取表中…

借PVE8.0的Debian 12系统配置一下NFS服务器

正文共&#xff1a;1234 字 16 图&#xff0c;预估阅读时间&#xff1a;2 分钟 前面我们介绍了基于Windows Server 2012 R2创建的共享NFS&#xff08;Network File System&#xff0c;网络文件系统&#xff09;存储&#xff08;Windows Server2012 R2搭建NFS服务器&#xff09;…

快速搭建开源分布式任务调度系统DolphinScheduler并远程访问

使用Docker部署开源分布式任务调度系统DolphinScheduler 文章目录 使用Docker部署开源分布式任务调度系统DolphinScheduler前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinSchedu…

移动医疗科技:开发互联网医院系统源码

在这个数字化时代&#xff0c;互联网医院系统成为了提供便捷、高效医疗服务的重要手段。本文将介绍利用移动医疗科技开发互联网医院系统的源码&#xff0c;为医疗行业的数字化转型提供有力支持。 智慧医疗、互联网医院这一类平台可以通过线上的形式进行部分医疗服务&#xff…

Python的版本如何查询?

要查询Python的版本&#xff0c;可以使用以下方法之一&#xff1a; 1.在命令行中使用python --version命令。这会显示安装在计算机上的Python解释器的版本号。 # Author : 小红牛 # 微信公众号&#xff1a;wdPython2.在Python脚本中使用import sys语句&#xff0c;然后打印sy…

P6入门:项目初始化1-项目详情介绍

前言 使用项目详细信息查看和编辑有关所选项目的详细信息&#xff0c;在项目创建完成后&#xff0c;初始化项目是一项非常重要的工作&#xff0c;涉及需要设置的内容包括项目名&#xff0c;ID,责任人&#xff0c;日历&#xff0c;预算&#xff0c;资金&#xff0c;分类码等等&…