数据结构:顺序栈

栈是一种先进后出的数据结构,只允许在一端(栈顶)操作,代码中top表示栈顶。

stack.h

/*===============================================
*   文件名称:stack.h
*   创 建 者:cxy     
*   创建日期:2024年01月17日
*   描    述:
================================================*/
#ifndef _STACK_H
#define _STACK_H

#include <stdio.h>
#include <stdlib.h>

typedef struct stack{
    int *arr; //malloc开辟空间
    int len;  //开辟空间大小
    int top;  //栈顶,栈只能从一端操作(栈顶)
}Stack,*Pstack;

int init(Pstack *P,int len);   //创建栈
int push_stack(Pstack p,int data);  //入栈
int pop_stack(Pstack p,int *data);  //出栈,只能从栈顶依次出栈
int empty_stack(Pstack p);  //栈空,1为空
int full_stack(Pstack p);  //栈满,1为满
int sum_stack(Pstack p);   //栈内元素个数


#endif

stack.c

/*===============================================
*   文件名称:stack.c
*   创 建 者:cxy     
*   创建日期:2024年01月17日
*   描    述:
================================================*/
#include "stack.h"

int init(Pstack *P,int len)
{
    *P = malloc(sizeof(Stack));  //结构体
    if(NULL == (*P))
    {
        perror("init err:*P");
        return -1;
    }
    (*P)->arr = malloc(sizeof(int)*len);  //数组
    if(NULL == (*P)->arr)
    {
        perror("init err:(*P)->arr");
        free(*P);
        return -1;
    }
    
    (*P)->len = len;
    (*P)->top = -1;   //将栈顶作为下标始用

    return 0;
}

int push_stack(Pstack p,int data)
{
    if(NULL == p)
    {
        perror("push err:p");
        return -1;
    }
    if(full_stack(p))
    {
        perror("push err:full");
        return -1;
    }
    
    p->arr[++(p->top)] = data;
    
    return 0;
}

//int *data为出栈元素,通过地址传递改变实际参数
//该函数返回值只作为判断
int pop_stack(Pstack p,int *data)
{
    if(NULL == p)
    {
        perror("pop err:p");
        return -1;
    }
    if(empty_stack(p))
    {
        perror("pop err:empty");
        return -1;
    }

    *data = p->arr[(p->top)--];
    
    return 0;
}

int empty_stack(Pstack p)
{
    if(NULL == p)
    {
        perror("empty err:p");
        return -1;
    }
    if(p->top == -1)
        return 1;
    else 
        return 0;
}
int full_stack(Pstack p)
{
    if(NULL == p)
    {
        perror("full err:p");
        return -1;
    }
    if((p->len)-1 == p->top)  //如len = 100,arr[100],top为下标最大为99
        return 1;
    else 
        return 0;
}

int sum_stack(Pstack p)
{
    if(NULL == p)
    {
        perror("sum err:p");
        return -1;
    }

    return p->top+1;   //下标加1
}

mian.c

/*===============================================
*   文件名称:main.c
*   创 建 者:cxy     
*   创建日期:2024年01月17日
*   描    述:
================================================*/
#include "stack.h"

int main(int argc, char *argv[])
{ 
    Pstack p;
    int data;
    printf("请输入开辟空间元素个数:\n");
    scanf("%d",&data);

    init(&p,data);
    
    printf("**********empty_stack,1为空**********\n");
    data = empty_stack(p);
    printf("%d\n",data);

    printf("**********push_stack**********\n");
    for(int i = 1;i < 6;i++)
    {
        printf("请输入第%i个入栈元素:",i);
        scanf("%d",&data);
        push_stack(p,data);
    }

    printf("**********full_stack,1为满**********\n");
    data = full_stack(p);
    printf("%d\n",data);
    
    printf("**********empty_stack,1为空**********\n");
    data = empty_stack(p);
    printf("%d\n",data);

    printf("**********sum_stack**********\n");
    data = sum_stack(p);
    printf("栈内共有%d个有效数据\n",data);
   
    printf("**********pop_stack**********\n");  //先进后出
    for(int i = 1;i < 6;i++)
    {
        pop_stack(p,&data);
        printf("第%i个出栈元素:%d\n",i,data);
    }

    printf("**********empty_stack,1为空**********\n");
    data = empty_stack(p);
    printf("%d\n",data);

    printf("**********full_stack,1为满**********\n");
    data = full_stack(p);
    printf("%d\n",data);

    printf("**********sum_stack**********\n");
    data = sum_stack(p);
    printf("栈内共有%d个有效数据\n",data);
    

    return 0;
} 

结果

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

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

相关文章

LeetCode、2542. 最大子序列的分数【中等,排序+小顶堆】

文章目录 前言LeetCode、2542. 最大子序列的分数【中等&#xff0c;排序小顶堆】题目及类型思路及代码实现 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领…

基于Springboot的摄影分享网站系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的摄影分享网站系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

GBASE南大通用数据库GBase BI V5支持的集群部署

GBaseBI V5可以单独部署在一个服务器上&#xff0c;在单套的情况下安装成功后不需要特殊的设置即可直接使用。某些用户的应用并发数可能很多&#xff0c;单个服务器处理请求太慢&#xff0c;GBaseBI V5支持集群和分布式部署。其中集群部署如下图所示&#xff1a; 集群部署 在集…

【Vue3】2-13 : 章节总结

本书目录&#xff1a;点击进入 一、总结内容 二、习题 2.1 【选择题】以下Vue指令中&#xff0c;哪些指令具备简写方式&#xff1f; 2.2 【编程题】以下Vue指令中&#xff0c;哪些指令具备简写方式&#xff1f; &#xff1e; 效果 &#xff1e; 代码 一、总结内容 了解核…

《WebKit 技术内幕》之三(3): WebKit 架构和模块

3 Webkit2 3.1 Webkit2 架构及模块 相比于狭义的WebKit&#xff0c;WebKit2是一套全新的结构和接口&#xff0c;而并不是一个简单的升级版。Webkit2 的思想同 Chrominum 类似&#xff0c;就是将渲染过程放在单独的进程中来完成&#xff0c;独立于用户界面。 webKit2中…

ARM 1.12

norflash与nandflash的区别&#xff1a; 一、NAND flash和NOR flash的性能比较 1、NOR的读速度比NAND稍快一些。 2、NAND的写入速度比NOR快很多。 3、NAND的4ms擦除速度远比NOR的5s快。 4、大多数写入操作需要先进行擦除操作。 5、NAND的擦除单元更小&#xff0c;相应的擦除电…

嵌入式软件工程师面试题——2025校招社招通用(二十一)

说明&#xff1a; 面试群&#xff0c;群号&#xff1a; 228447240面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但…

Unity关于新手引导中实现遮罩镂空效果

在新手引导每一步中实现可以遮掉其他部分而显示当前需要点击的部分&#xff0c;只需要在每一步引导的时候设置对应的镂空区域的RectTransform.效果如下图&#xff1a; 代码&#xff1a; public class SelfMaskSet : MaskableGraphic, ICanvasRaycastFilter {[SerializeField]p…

企业面临哪些能源消耗问题,能源消耗监测管理系统是如何解决这些问题?

随着全球环境问题的日益严重&#xff0c;能源问题一直被世界广泛关注。在企业运营过程中&#xff0c;能源消耗问题也是一大挑战。企业在生产和运营过程中需要大量的能源支持&#xff0c;包括电、水、气、热等多种能源。由于能源价格的不稳定性&#xff0c;使得企业在能源消耗方…

数学建模--比赛

内容来自数学建模BOOM&#xff1a;【快速入门】北海&#xff1a;数模建模基础MATLAB入门论文写作数学模型与算法(推荐数模美赛国赛小白零基础必看教程)_哔哩哔哩_bilibili 目录 1.学习内容 2.参赛须知 1&#xff09;参赛作品的组成 2)参赛作品的提交 3.软件安装 4.注意…

微图Web版如何加载吉林一号影像?

曾为你分享了如何查看调用我们已购买的上海黄浦区区县图。 这里再以该图源为例&#xff0c;为你分享在水经微图&#xff08;简称“微图”&#xff09;Web版中如何加载吉林一号影像的方法。 吉林一号图源 如果你还没有吉林一号图源&#xff0c;可以从以下网址登录后免费申请。…

《C++ Primer》第15章 面向对象程序设计(一)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 15.1 OOP&#xff1a;概述&#xff08;P526&#xff09; **面向对象程序设计&#xff08;object-oriented programming&#xff09;**的核心思想是数据抽象、继承和动态绑定。 继承 通过继承&#xff08;…

pycharm import torch

目录 1 安装 2 conda环境配置 3 测试 开始学习Pytorch! 1 安装 我的电脑 Windows 11 Python 3.11 Anaconda3-2023.09-0-Windows-x86_64.exe cuda_11.8.0_522.06_windows.exe pytorch &#xff08;管理员命令行安装&#xff09; pycharm-community-2023.3.2.exe 2 c…

集成电路/芯片可循环成本(RE)和非可循环成本(NRE)

数字集成电路&#xff08;Integrated Circuit&#xff0c;IC&#xff09;的成本可以分为可循环成本和非可循环成本两类。 可循环成本是指在芯片制造过程中&#xff0c;随着芯片批量的增加而逐渐降低的成本。可循环成本主要包括&#xff1a; 晶圆制造成本&#xff1a;包括晶圆…

OpenCV-19图像的仿射变换

放射变换是图像旋转&#xff0c;缩放&#xff0c;平移的总称&#xff0c;具体的做法是通过一个矩阵和原图片坐标进行计算&#xff0c;得到新的坐标&#xff0c;完成变换&#xff0c;所以关键就是这个矩阵。 一、仿射变换之图像平移 使用API------warpAffine&#xff08;src &…

C++ --- 基础知识与细节(上)

目录 1. 常量 2.关键字 3.标识符命名规则 4.数据类型 4.1 整型 4.2实型&#xff08;浮点型&#xff09; 4.3 字符型 4.4 字符串型 4.5布尔类型 bool &#xff08;只占一个字节大小&#xff09; 5.sizeof关键字 6.数据的输入 7. goto语句 8. 一维数组 // 数组名是常量&am…

【Filament】材质系统

1 前言 本文主要介绍 Filament 的材质系统&#xff0c;官方介绍详见 → Filament Materials Guide。材质系统中会涉及到一些空间和变换的知识点&#xff0c;可以参考&#xff1a;【Unity3D】空间和变换、【Unity3D】Shader常量、变量、结构体、函数、【OpenGL ES】MVP矩阵变换、…

IDEA中启动项目报堆内存溢出或者没有足够内存的错误

1.报错现象 java.lang.OutOfMemoryError: Java heap space 或者 Could not reserve enough space for object heap 2.解决办法 在运行配置中VM选项后加下面的配置&#xff1a; -server -XX:MaxHeapSize256m -Xms512m -Xmx512m -XX:PermSize128M -XX:MaxPermSize256m 3.JVM虚…

Conmi的正确答案——eclipse C/C++显示“未解析的包含:<xxx.h>”/“Unresolved inclusion: <xxx.h>”

eclipse IDE 版本&#xff1a;2023-12 部分采自&#xff1a;解决方法&#xff1a;关于问题 “C - Unresolved inclusion: <iostream>” 解释事项&#xff1a;方法一可能版本不同&#xff0c;部分界面修改了。这里使用的是方法二的解决方法。&#xff08;或者各位大神的描…

Gartner发布数据安全治理指南:采取四个关键步骤,加快数据安全治理的采用

部署数据安全控制措施是为了保护数据及隐私&#xff0c;但业务领导者通常采用与业务成果直接相关的评判标准对数据进行分类&#xff0c;这与安全领域使用的数据分类观点不同。首席信息安全官&#xff08;CISO&#xff09;应克服沟通障碍&#xff0c;展示如何通过增强数据安全来…