数据结构(c语言版) 栈

news2024/12/26 11:01:47

顺序栈

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

代码

#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);

}

运行结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小程序制作(超详解!!!)第十四节 计时器

1.案例描述 设计一个实现倒计时功能的小程序&#xff0c;小程序运行后&#xff0c;首先显示空白界面&#xff0c;过2秒后才显示计时界面点击“开始计时”按钮后开始倒计时&#xff0c;点击“停止计时”按钮后停止计时。 2.index.wxml <view class"box" hidden&…

Docker安装、卸载,以及各种操作

docker是一个软件&#xff0c;是一个运行与linux和windows上的软件&#xff0c;用于创建、管理和编排容器&#xff1b;docker平台就是一个软件集装箱化平台&#xff0c;是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xf…

服务器数据恢复—云服务器mysql数据库表被truncate的数据恢复案例

云服务器数据恢复环境&#xff1a; 阿里云ECS网站服务器&#xff0c;linux操作系统mysql数据库。 云服务器故障&#xff1a; 在执行数据库版本更新测试时&#xff0c;在生产库误执行了本来应该在测试库执行的sql脚本&#xff0c;导致生产库部分表被truncate&#xff0c;还有部…

【达梦数据库】mysql与达梦整数类型对比关系

最近遇了mysql 和达梦整数类型的数据范围对比&#xff0c;做了个表格供大家分享 对比表格 要说明的是我整理的时候&#xff0c;达梦貌似没有无符号整数类型&#xff08;防杠保护&#xff09;&#xff0c;也就是只能将mysql/dm 的有符号整数类型的的范围值进行对比 MYSQL - t…

C#开源项目:私有化部署LLama推理大模型

推荐一个C#大模型推理开源项目&#xff0c;让你轻松驾驭私有化部署&#xff01; 01 项目简介 LLama是Meta发布的一个免费开源的大模型&#xff0c;是一个有着上百亿数量级参数的大语言模型&#xff0c;支持CPU和GPU两种方式。 而LLamaSharp就是针对llama.cpp封装的C#版本&am…

【数学】 4、向量的内积、外积、模长

文章目录 一、向量点乘&#xff08;内积&#xff09;1.1 几何意义1.2 点乘的代数定义&#xff0c;推导几何定义&#xff08;用于求向量夹角&#xff09;1.2.1 余弦定理 1.3 程序计算 二、向量叉乘&#xff08;外积&#xff09;2.1 几何意义 三、通俗理解内积和外积四、向量的模…

kubernetes集群编排——k8s调度

nodename vim nodename.yaml apiVersion: v1 kind: Pod metadata:name: nginxlabels:app: nginxspec:containers:- name: nginximage: nginxnodeName: k8s2 nodeName: k8s2 #找不到节点pod会出现pending&#xff0c;优先级最高 kubectl apply -f nodename.yamlkubectl get pod …

AI系统ChatGPT程序源码+AI绘画系统源码+支持GPT4.0+Midjourney绘画+已支持OpenAI GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

VMware创建Linux虚拟机之(三)Hadoop安装与配置及搭建集群

Hello&#xff0c;world&#xff01; &#x1f412;本篇博客使用到的工具有&#xff1a;VMware16 &#xff0c;Xftp7 若不熟悉操作命令&#xff0c;推荐使用带GUI页面的CentOS7虚拟机 我将使用带GUI页面的虚拟机演示 虚拟机&#xff08;Virtual Machine&#xff09; 指通过…

2023年【安全员-A证】最新解析及安全员-A证在线考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-A证最新解析是安全生产模拟考试一点通生成的&#xff0c;安全员-A证证模拟考试题库是根据安全员-A证最新版教材汇编出安全员-A证仿真模拟考试。2023年【安全员-A证】最新解析及安全员-A证在线考试 1、【多选题…

计算机毕业设计项目选题推荐(免费领源码)java+ssm+Mysq学科竞赛管理系统08604

摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存…

学编程始于C语言,但只学C远远不够的!

前言 写了20多年的代码&#xff0c;之前做过阿里的高级架构师&#xff0c;在技术这条路上跌跌撞撞了很多&#xff0c;我今天分享一些我个人的自学方法给各位。为什么我会说&#xff1a;不推荐任何人用C语言作为编程启蒙第一课&#xff1f; 这里有很多同学要站出来说了&#x…

rabbitMQ rascal/amqplib报错 Error: Unexpected close 排查

以下是一些可能导致此 RabbitMQ 客户端或任何其他 RabbitMQ 客户端中的套接字读取或写入失败的常见场景 1.错过&#xff08;客户端&#xff09;心跳 第一个常见原因是RabbitMQ 检测到心跳丢失。发生这种情况时&#xff0c;RabbitMQ 将添加一个有关它的日志条目&#xff0c;然…

centos 7部署Mysql8.0主从

Mysql官网中关于部署主从的网址 环境准备&#xff1a; 搭建虚拟机和安装Mysql之前的文章中已经涉及&#xff0c;在此不再赘述。 主从IPMysql账号密码主192.168.213.4root/Root1234!从192.168.213.5root/Root1234! 1、主数据库设置 配置my.cnf 一般存放于/etc/。 主从配…

AI时代产品经理升级之道:ChatGPT让产品经理插上翅膀

文章目录 一、ChatGPT简介二、ChatGPT在产品经理工作中的应用1. 快速获取用户反馈2. 智能分析竞品3. 智能推荐产品4.分析市场趋势5.优化产品功能 三、总结与展望《AI时代产品经理升级之道&#xff1a;ChatGPT让产品经理插上翅膀》亮点内容简介目录作者简介获取方式 随着人工智能…

viple进阶1:打印星号

&#xff08;1&#xff09;题目&#xff1a;打印星号 请观察下图&#xff0c;使用viple编程实现 &#xff08;2&#xff09;设计与实现 第1种方法&#xff1a;行打印 利用行打印活动打印完数据后会自动换行特性 首先打印第一行&#xff0c;一颗星可以是字符类型&#xff0c…

python 之 字符串的相关知识

文章目录 字符串的创建基本操作字符串方法格式化字符串字符串不可变性编码和解码字符串方法详细介绍字符串方法列表1. len()2. 大小写转换方法3. 删除空白字符的方法4. 查找子字符串的方法5. 替换子字符串的方法6. 分割和连接字符串的方法7. 校验字符串内容的方法 格式化详细介…

C++——搜索二叉树

作者&#xff1a;几冬雪来 时间&#xff1a;2023年11月7日 内容&#xff1a;C的搜索二叉树讲解 目录 前言&#xff1a; 什么是搜索二叉树&#xff1a; 搜索二叉树的增删查改&#xff1a; 搜索二叉树的定义初始化&#xff1a; 搜索二叉树增操作&#xff1a; 搜索二叉树找…

蓝桥杯算法竞赛系列第十章·nSum问题的代码框架

你好&#xff0c;我是安然无虞。 文章目录 一、两数之和变形题 二、三数之和三、四数之和 首先&#xff0c;何为nSum问题呢&#xff1f; nSum问题其实就是给你一个数组nums和一个目标和target&#xff0c;让我们从nums数组中选择n个数&#xff0c;使得这些数字之和等于target。…

Flink集群的搭建

1、Flink独立集群模式 1、首先Flink的独立集群模式是不依赖于Hadoop集群。 2、上传压缩包&#xff0c;配置环境&#xff1a; 1、解压&#xff1a; tar -zxvf flink-1.15.2-bin-scala_2.12.tgz2、配置环境变量&#xff1a;vim /etc/profileexport FLINK_HOME/usr/local/soft/fl…