C语言实现栈(基于数组)

2023-11-15

栈是一种操作受限的数据结构,只允许从一段操作,而且先进后出(FILO  first in last out)这里将栈的操作封装在C语言的头文件里

实现栈的代码如下

 

#include<stdbool.h>
#define maxsize 10
typedef int datatype;

//Sequence Stack 实现顺序栈,使用数组来实现
struct stack
{
    datatype data[maxsize];
    int top;
};

typedef struct stack Stack;
//创建栈

Stack s;
//初始化栈
void init()
{
    s.top=-1;
}

//判断栈是否为空
bool Empty()
{
    if(s.top==-1)
    {
        return true;
    }
    else
    {
        return false;
    }
}

//判断栈是否已满了
bool full()
{
    if(s.top==maxsize-1)
    {
        return true;
    }
    else
    {
        return false;
    }
}

//入栈
void Push(datatype element)
{
    if(!full())
    {
        s.top++;
        s.data[s.top]=element;
    }
    else
    {
        printf("栈满\n");
    }
}

//出栈
void Pop()
{
    if(!Empty())
    {
        s.top--;
    }
    else
    {
        printf("栈空\n");
    }
}

//取栈顶元素
datatype Top()
{
    if(!Empty())
    {
        return s.data[s.top];
    }
    else
    {
        printf("栈空\n");
    }
}

//销毁栈
void Destroy()
{
    s.top=-1;
}

 

 

测试栈的代码如下:

 

 

 

#include<stdio.h>
#include "SequenceStack.h"
int main()
{
    int i=0;
    // struct stack s;
    //初始化栈
    printf("\n###########初始化栈###########\n");
    init();
    printf("----------------------------------");    
    //入栈操作
    printf("\n###########入栈操作###########\n");
    for(i=0;i<=10;i++)
    {
        Push(i);
    }
    printf("----------------------------------");
    printf("\n###########取栈顶元素###########\n");
    printf("%d\n",Top());
    printf("----------------------------------");    
    //出栈操作
    printf("\n###########出栈操作###########\n");
    for(i=0;i<=10;i++)
    {
        Pop();
    }  
    printf("----------------------------------");    
    printf("\n###########取栈顶元素###########\n");
    Top();
    printf("----------------------------------");
    printf("\n###########销毁栈###########\n"); 
    Push(10);
    Destroy();
    Top();
}

 

 

这样实现栈,宏定义处maxsize表示栈的大小,方便以后修改,typedef也是同样的效果,可以随时改变数据类型。

 

 

在操作栈的时候也只要用到push、pop、top、等方法就可以了

这样的栈有一个明显的缺点,是栈被定义在头文件里,这样使用者只能使用一个栈,无法同时建立两个栈,考虑到这一点,对栈的代码做出修改

实现栈的代码

 

#include<stdbool.h>
#define maxsize 10
typedef int datatype;

//Sequence Stack 实现顺序栈,使用数组来实现
struct stack
{
    datatype data[maxsize];
    int top;
};

typedef struct stack Stack;
//创建栈

// Stack s;
//初始化栈
void init(Stack *s)
{
    s->top=-1;
}

//判断栈是否为空
bool Empty(Stack *s)
{
    if(s->top==-1)
    {
        return true;
    }
    else
    {
        return false;
    }
}

//判断栈是否已满了
bool full(Stack *s)
{
    if(s->top==maxsize-1)
    {
        return true;
    }
    else
    {
        return false;
    }
}

//入栈
void Push(Stack *s,datatype element)
{
    if(!full(s))
    {
        s->top++;
        s->data[s->top]=element;
    }
    else
    {
        printf("栈满\n");
    }
}

//出栈
void Pop(Stack *s)
{
    if(!Empty(s))
    {
        s->top--;
    }
    else
    {
        printf("栈空\n");
    }
}

//取栈顶元素
datatype Top(Stack *s)
{
    if(!Empty(s))
    {
        return s->data[s->top];
    }
    else
    {
        printf("栈空\n");
    }
}

//销毁栈
void Destroy(Stack *s)
{
    s->top=-1;
}


测试栈的代码

 

#include<stdio.h>
#include "SequenceStack1.0.h"
int main()
{
    int i=0;
    Stack p; 
    Stack *s;
    s=&p;
    // struct stack s;
    //初始化栈
    printf("\n###########初始化栈###########\n");
    init(s);
    printf("----------------------------------");    
    //入栈操作
    printf("\n###########入栈操作###########\n");
    for(i=0;i<=10;i++)
    {
        Push(s,i);
    }
    printf("----------------------------------");
    //取栈顶元素
    printf("\n###########取栈顶元素###########\n");
    printf("%d\n",Top(s));
    printf("----------------------------------");    
    //出栈操作
    printf("\n###########出栈操作###########\n");
    for(i=0;i<=12;i++)
    {
        Pop(s);
    }  
    printf("----------------------------------");
    //取栈顶元素    
    printf("\n###########取栈顶元素###########\n");
    Top(s);
    printf("----------------------------------");
    //销毁栈
    printf("\n###########销毁栈###########\n"); 
    Push(s,10);
    Destroy(s);
    Top(s);
}

 

这里可以在主函数中自己定义栈,从而同时实现多个栈,但是这样的栈还是大小固定的,每次修改maxsize很麻烦,所以想到malloc函数,对栈的代码做了进一步的修改

 

实现栈的代码

 

#include<stdbool.h>
#include<stdlib.h>
#define maxsize 10
typedef int datatype;

//Sequence Stack 实现顺序栈,使用数组来实现
struct stack
{
    datatype *data;
    int top;
};

typedef struct stack Stack;
//创建栈

int realsize=maxsize;

// Stack s;
//初始化栈
void init(Stack *s)
{
    s->data = (datatype *)malloc(sizeof(datatype)*maxsize);
    s->top=-1;
}

//判断栈是否为空
bool Empty(Stack *s)
{
    if(s->top==-1)
    {
        return true;
    }
    else
    {
        return false;
    }
}

//判断栈是否已满了
void full(Stack *s)
{
    if(s->top==realsize-1)
    {
        realsize++;
        s->data=(datatype *)realloc(s->data,realsize*sizeof(datatype));
    }
}

//入栈
void Push(Stack *s,datatype element)
{
    full(s);
    s->top++;
    s->data[s->top]=element;
}

//出栈
void Pop(Stack *s)
{
    if(!Empty(s))
    {
        s->top--;
    }
    else
    {
        printf("栈空\n");
    }
}

//取栈顶元素
datatype Top(Stack *s)
{
    if(!Empty(s))
    {
        return s->data[s->top];
    }
    else
    {
        printf("栈空\n");
    }
}

//销毁栈
void Destroy(Stack *s)
{
    s->top=-1;
    free(s->data); //释放堆上内存
}

 

测试栈的代码

 

 

#include<stdio.h>
#include "DynamicStack1.0.h"
int main()
{
    int i=0;
    Stack p; 
    Stack *s;
    s=&p;
    // struct stack s;
    //初始化栈
    printf("\n###########初始化栈###########\n");
    init(s);
    printf("----------------------------------");    
    //入栈操作
    printf("\n###########入栈操作###########\n");
    for(i=0;i<=10;i++)
    {
        Push(s,i);
    }
    printf("----------------------------------");
    //取栈顶元素
    printf("\n###########取栈顶元素###########\n");
    printf("%d\n",Top(s));
    printf("----------------------------------");    
    //出栈操作
    printf("\n###########出栈操作###########\n");
    for(i=0;i<=12;i++)
    {
        Pop(s);
    }  
    printf("----------------------------------");
    //取栈顶元素    
    printf("\n###########取栈顶元素###########\n");
    Top(s);
    printf("----------------------------------");
    //销毁栈
    printf("\n###########销毁栈###########\n"); 
    Push(s,10);
    Destroy(s);
    Top(s);
}

 

这样就可以实现无限大小的栈了,这里realloc之后的指针,在free的时候容易出错

 

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

C语言实现栈(基于数组) 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • 按成员序列化

    我已经实现了template
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • 重载<<的返回值

    include
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐

  • switch游戏机小白初体验

    1 switch版本区别 lite 续航版与oled的区别 oled屏幕比续航版的大 续航版和oled版都可以连接电视或显示器 lite只能玩掌机 只喜欢玩掌机的可以选lite 更便宜 国行 港版 日版的区别 国行不能与全球玩家联机 不能买
  • warning: could not find UI helper ‘git-credential-manager-ui‘

    可以先试试别人的教程 58条消息 关于git 凭证存储 credential helper配置 解决 git pull push fetch remote not found的问题 DavidFFFFFF的博客 CSDN博客 我是因为换了电
  • Python pyinstaller打包exe最完整教程

    目录 1 简介 2 安装 3 原理和打包效果 3 1 原理概述 3 2 搜索模块 3 3 打包效果概述 3 4 打包成单个文件夹 优点 缺点 3 5 打包成单个exe 优点 缺点 4 打包 4 1 基本语法 4 2 参数总览 位置参数 可选
  • IDEA导入eclipse项目并部署运行完整步骤(转发)

    首先说明一下 idea里的project相当于eclipse里的workspace 而idea里的modules相当于eclipse里的project 1 File gt Import Project 在弹出的对话框里选择要导入的项目 2
  • IAR仿真确认延时程序时间的准确性

    单片机 程序经常会用到延时函数 毫秒延时或微秒延时函数 为了确认延时函数时间的准确性 以前经常是需要通过IO口输出波形来确认时间是否准确 最近发现了个更方便准确的方法 只需要通过IAR仿真软件即可准确知道延时函数的运行时间 1 首先在IAR
  • SQL 数据更新

    SQL 数据更新 数据更新有三种 插入 修改 删除 一 插入数据 插入元组 行 INSERT Into lt 表名 gt lt 属性列1 gt lt 属性列2 gt lt 属性列3 gt lt 属性列4 gt Values lt 常量1 g
  • 2022.7台式机装机指南(3060 + 12490F)

    文章目录 硬件购买 装机避坑 系统制作 系统激活 大学四年用的华硕飞行堡垒FX86 那时候的配置还可以 8代i7 1050ti 8G 256固态 1T机械 后来又买了一张内存条 扩到了16g 四年只出过2次故障 第一次蓝屏自己修好了 第二次
  • PDF Redactor - 涂黑屏蔽PDF文字让敏感内容不可读的软件工具

    PDF Redactor是一款Windows平台下的PDF小工具软件 旨在涂黑屏蔽或删除PDF文件中的敏感文本和图像以保护隐私 被屏蔽的内容不仅在PDF阅读器中无法查看 而且即使使用文本搜索功能也无法再找到这部分内容 这些内容将从PDF文件
  • python json.dumps中文乱码问题解决

    json dumps var ensure ascii False 并不能解决中文乱码的问题 json dumps在不同版本的Python下会有不同的表现 注意下面提到的中文乱码问题在Python3版本中不存在 注 下面的代码再python
  • 解决pyside6-uic生成py代码中文为unicode(乱码)的问题

    前言 本来想用Java做客户端 后来发现很多算法还是Python有现成的比较方便 所以最终选择了pyside6 但是用Designer QT设计师 设计完后 生成的代码中文部分显示为unicode 也可以理解为乱码 就像这样 self pu
  • 前端分页插件_免费开源的React前端框架——ReactAdmin

    介绍 ReactAdmin是一个Github上免费开源的前端框架 不是组件库 也不是模板 它是一个框架 采用es6 React和Material Design构建基于Rest GraphQl API的Web应用程序 在React上star数
  • Android实现用户登录和注册界面

    我们在做android项目时经常会用到用户登录 这里呈上实现了Spinner的登录界面 初学的朋友可以直接拿过来使用 本界面使用的是流式布局 也是我最喜欢用的布局方式 同学们可以通过代码了解一下 代码中Intent的使用有点杂乱 主要是为了
  • sql逗号分开的指定列,分成多行

    if object id tempdb dbo tb is not null drop table tb go create table tb id int price varchar 100 customer int cinvcode i
  • 掌握这个技能,再也不用为面试发愁了

    点击上方 前端瓶子君 关注公众号 回复算法 加入前端编程面试算法每日一题群 废话只说一句 码字不易求个 收藏 学会 快行动起来吧 评论区走起 在面试时 经过简单寒暄后 面试官一般先从让候选人自我介绍开始 紧接着就是问候选人简历中所列的项目
  • weblogic CVE-2023-21839 复现

    影响版本 Weblogic 12 2 1 3 0 Weblogic 12 2 1 4 0 Weblogic 14 1 1 0 0 这里是用的docker下载的vulhub的CVE 2023 21839 靶机和攻击机都是192 168 85
  • 2019.08 FSGAN -论文解读

    原文链接 https zhuanlan zhihu com p 138042376 笔者前言 FSGAN Subject Agnostic Face Swapping and Reenactment 是ICCV19的一篇文章 主要工作是面部
  • 高等代数 二次型与矩阵的合同(第6章)1 二次型,标准形,规范形

    一 二次型 6 1 1 概念 2 非退化线性替换 准确地说 应该是将 x x x用 C x Cx Cx带入 这样能保证代换前后二次型中的元不
  • 玩转Mysql系列 - 第15篇:详解视图

    这是Mysql系列第15篇 环境 mysql5 7 25 cmd命令中进行演示 需求背景 电商公司领导说 给我统计一下 当月订单总金额 订单量 男女订单占比等信息 我们啪啦啪啦写了一堆很复杂的sql 然后发给领导 这样一大片sql 发给领导
  • Request对象和response对象

    一 概念 request对象和response对象是通过Servlet容器 如Tomcat 自动创建并传递给Servlet的 Servlet容器负责接收客户端的请求 并将请求信息封装到request对象中 然后将request对象传 递给相
  • C语言实现栈(基于数组)

    栈是一种操作受限的数据结构 只允许从一段操作 而且先进后出 FILO first in last out 这里将栈的操作封装在C语言的头文件里 实现栈的代码如下 include