C语言/C++实现栈操作

2023-11-18

一、栈的概念

栈是一种常用的数据结构,它遵循先入后出(Last-In-First-Out,LIFO)的原则。栈的操作只在栈的一端进行,该端被称为栈顶,而另一端称为栈底。栈的基本操作包括压栈(入栈-push)和弹栈(出栈-pop),分别用于将元素添加到栈顶和从栈顶删除元素。

二、栈的实现

我们可以使用C语言中的数组来实现栈。下面是一个基本的栈的定义:

#define MAX_SIZE 100

typedef struct {
    int data[MAX_SIZE];
    int top;
} Stack;

在这里,我们使用了一个数组data来存储栈的元素,以及一个整数top来表示栈顶的位置。栈为空时,top的值为-1。

1、初始化栈

在使用栈之前,我们需要先将其进行初始化,可以通过将top设置为-1来实现:

//初始化栈 
void init(Stack *stack) {
	stack->top = -1;
	printf("初始化栈完成......\n");
}

2、判断栈是否为空

我们可以通过判断top的值是否为-1来确定栈是否为空:

int isEmpty(Stack *stack) {
    return stack->top == -1;
}

3、判断栈是否已满

为了防止栈溢出,我们需要在执行push操作之前检查栈是否已满。当top的值等于MAX_SIZE-1时,表示栈已满:

int isFull(Stack *stack) {
    return stack->top == MAX_SIZE - 1;
}

4、执行压栈操作

压栈操作用于将元素添加到栈顶,首先需要判断栈是否已满,如果栈未满,将元素添加到top所指向的位置,并将top向上移动一个位置:

//入栈操作 
void push(Stack *stack, int element) {
    if (!isFull(stack)) {
        stack->data[++stack->top] = element;
        printf("完成一次入栈,入栈元素:%d\n",element);
    } else {
        printf("栈满,不能入栈。\n");
    }
}

5、执行弹栈操作

弹栈操作用于删除栈顶的元素,并返回该元素的值,首先需要判断栈是否为空,如果栈非空,返回top位置的元素并将top向下移动一个位置:

//出栈操作 
int pop(Stack *stack) {
    if (!isEmpty(stack)) {
        printf("完成一次出栈,");
		return stack->data[stack->top--];
    } else {
        printf("栈空,不能出栈\n");
        return -1;
    }
}

三、示例代码

下面是一个使用栈的简单示例代码,展示了如何进行压栈和弹栈操作:

#include <stdio.h>

//栈容 
#define MAX_SIZE 100

typedef struct {
    int data[MAX_SIZE];
    int top;
} Stack;

//初始化栈 
void init(Stack *stack) {
	stack->top = -1;
	printf("初始化栈完成......\n");
}

//判断栈是否为空 
int isEmpty(Stack *stack) {
    return stack->top == -1;
}

//判断是否栈满 
int isFull(Stack *stack) {
    return stack->top == MAX_SIZE - 1;
}

//入栈操作 
void push(Stack *stack, int element) {
    if (!isFull(stack)) {
        stack->data[++stack->top] = element;
        printf("完成一次入栈,入栈元素:%d\n",element);
    } else {
        printf("栈满,不能入栈。\n");
    }
}

//出栈操作 
int pop(Stack *stack) {
    if (!isEmpty(stack)) {
        printf("完成一次出栈,");
		return stack->data[stack->top--];
    } else {
        printf("栈空,不能出栈\n");
        return -1;
    }
}

//遍历栈内元素
void printStack(Stack *stack){
	printf("栈内元素为:");
	int index=stack->top;
	while(index>=0){
		printf("%d\t",stack->data[index--]);
	}
	printf("\n");
} 
int main() {
    Stack stack;
    init(&stack);

    push(&stack, 1);
    printStack(&stack);
    push(&stack, 2);
    printStack(&stack);
    push(&stack, 3);
    printStack(&stack);

    printf("出栈元素: %d\n", pop(&stack));
    printf("出栈元素: %d\n", pop(&stack));
    printf("出栈元素: %d\n", pop(&stack));

    return 0;
}

以上代码会输出以下结果:

Popped element: 3
Popped element: 2
Popped element: 1

这就是用C语言实现栈的基本操作的详细教程。希望这对你有所帮助!

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

C语言/C++实现栈操作 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置

随机推荐

  • 【CSS】background相关属性深入学习

    最近一次需求中对于background相关的一些属性使用较多 总结下 希望提高下次的开发效率 background属性 background color background image background position backgr
  • .NET面试题——第7篇 C#类和对象

    1 什么是类和对象以及关系 对象 一种具有状态 属性 和行为 方法 的编程实体 用于描述现实世界的某个具体事物 类 具用一系列对象共同特征和行为的通用类型 对象和类的关系 类是对象的抽象 而对象是类的具体实例 类是抽象的 不占用内存 而对象
  • go爬虫框架colly的精简讲解

    1 拉取软件包 go get github com gocolly colly 2 创建colly的收集器 colly NewCollector 可以在创建的时候进行配置 c colly NewCollector colly AllowUR
  • Java 断点调试 循环调试

    java断点调试 以eclipse为例 1 基础调试 这里都是一些基础 除了最后一个都十分常用 名称 快捷键 作用 Resume F8 运行至下一断点 Step Into F5 进入方法 Step Over F6 运行完当前语句 User
  • PCL 点云按高程渲染颜色

    目录 一 算法原理 二 代码实现 三 结果展示 四 CloudCompare 五 备注 一 算法原理 首先按照Z轴方向求取所在点云的高程极值 包括高程最大值与最小值 计算高程中值 然后选取渲染的红 绿 蓝三种颜色的值 最后 自上而下 为红绿
  • NBA的字母哥如何拿到2415万美金年薪

    前言 NBA是世界上最成功的体育联盟之一 为了制定合理的运作规范 联盟会与球员工会签署劳资协议 协议里规定了球队的工资帽 一支球队球员工资总额的上限 顶薪 球员薪水的上限 底薪 球员的最低薪水 和其他规范 2011年 经历了停摆事件 联盟和
  • 一张图理清ASP.NET Core启动流程

    1 引言 对于ASP NET Core应用程序来说 我们要记住非常重要的一点是 其本质上是一个独立的控制台应用 它并不是必需在IIS内部托管且并不需要IIS来启动运行 而这正是ASP NET Core跨平台的基石 ASP NET Core应
  • JS 数组定义及详解

    一 数组简介 1 什么是数组 数组是值的有序集合 每个值叫做元素 每个元素在数组中都有数字位置编号 也就是索引 JS中的数组是弱类型的 数组中可以含有不同类型的元素 数组元素甚至可以是对象或其他数组 例如 var arr 1 true nu
  • kubernetes运维---calico之ipip模式抓包分析

    一 calico介绍 Calico是Kubernetes生态系统中另一种流行的网络选择 虽然Flannel被公认为是最简单的选择 但Calico以其性能 灵活性而闻名 Calico的功能更为全面 不仅提供主机和pod之间的网络连接 还涉及网
  • 功能实现:Unity中一个动画,只播放中间指定的一截,而且循环播放

    一 要播放的动画 直播中间一截 如图 总的动画为长度为2分钟零8秒 二 Button和对应事件 三 事件的代码 在Start 里面绑定 private void Awake myAnim animGo GetComponent
  • Flutter实现app自动升级

    话不多说 有过开发过移动应用的人都应该自动升级流程 首先获取本地应用版本 然后从服务器获取线上移动应用版本号作比较是否升级 第一步获取版本信息 API https pub dev packages package info 获取应用版本号
  • iview on-change用法

    原地址 https segmentfault com q 1010000011589626 iview框架select选择框on change事件如何返回当前选中的值 这是文档中的解释 on change 选中的Option变化时触发 默认
  • C++类与封装实例说明

    众所周知 C 具有三大特性 分别为封装 继承 多态 今天有位同学问到我应该如何去理解 我翻了翻笔记本 找到以前上课时学到的案例来解释 首先 成员函数存在希望公开或不希望公开的属性 这也构成了定义成员函数访问级别的三项 1 public 公开
  • 架构师--IT策略灵魂的创造者

    http blog csdn net aspop archive 2006 01 21 585823 aspx 在比尔 盖茨的众多称谓中 据说他更偏爱 首席软件架构师 同样 在网易创始人丁磊名字前 也有 首席架构师 这样的称谓 对于企业来说
  • IDEA国际化资源Key无法全局重命名的解决方案

    一 前言 最近在开发中使用到了HibernateValidator进行入参校验以及错误消息的国际化支持 大家应该都知道在使用HibernateValidator进行校验的时候 我们只需在需要在校验的变量上添加相应的注解 同时在message
  • Flutter 应用程序更新

    Flutter 应用程序更新 原文 https medium com flutter community in app update the flutter way 2f25e4a02c02 前言 当您推出应用程序的新版本时 您希望您的用户
  • CSS3背景渐变

    我们经常可以看到有些背景色并不是纯色 而是好看的渐变色 css3知我懂我 给我们提供了制作渐变背景色的属性 渐变主要包括线性渐变和径向渐变 接下来逐一介绍用法 1 线性渐变 线性渐变 linear gradients 表示颜色沿着一条直线过
  • 设计模式--原型模式

    原型模式 属于创建型模式 基本原理 又称为克隆模式 拷贝本身对象 可以直接使用语言中的拷贝构造 主要流程 在构建对象的时候实现一个对本身的拷贝函数 特别注意 要有对应的销毁方法 include
  • 集合框架(二)

    集合框架 二 回顾 Collection List Set的特点 Collection 不唯一的 无序的 List 不唯一的 有序 Set 唯一的 无序的 Collection和Collections的区别 Collection是集合的顶级
  • C语言/C++实现栈操作

    一 栈的概念 栈是一种常用的数据结构 它遵循先入后出 Last In First Out LIFO 的原则 栈的操作只在栈的一端进行 该端被称为栈顶 而另一端称为栈底 栈的基本操作包括压栈 入栈 push 和弹栈 出栈 pop 分别用于将元