数据结构中的栈(C语言版)

一.栈的概念

栈是一种常见的数据结构,它遵循后进先出的原则。栈可以看作是一种容器,其中的元素按照一种特定的顺序进行插入和删除操作。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。

1.栈的特点

    1.元素的插入和删除操作只能在栈的一端进行,该端被称为栈顶。

    2.最后插入的元素是第一个被删除的元素,因此称为后进先出。

    3.栈中的元素没有编号或索引,只有栈顶指针来指示栈的当前位置。

2.栈的优点

  1. 简单高效:栈的操作是基于后进先出(LIFO)的原则,入栈和出栈操作都只涉及栈顶元素,因此操作的时间复杂度都是O(1),使得栈的操作非常高效。

  2. 空间效率高:栈的底层实现可以使用数组或链表,无论是使用静态数组还是动态链表,都可以根据实际需要灵活分配内存,因此在空间利用上比较高效。

  3. 递归和回溯:栈在递归和回溯算法中扮演着重要的角色。递归函数调用时会将当前函数的状态(包括局部变量、返回地址等)压入栈中,当递归函数返回时,栈顶的状态会被弹出,恢复到上一层递归函数的状态。

  4. 撤销操作:栈可以用于实现撤销操作,比如文本编辑器中的撤销功能。每当执行一个操作时,将操作的状态存储在栈中,当需要撤销时,只需从栈中弹出最近的状态。

3.栈的缺点

  1. 容量限制:栈的容量是有限的,无论是基于数组还是链表实现的栈,都会受到内存大小的限制。当栈的元素个数超过容量时,会发生栈上溢(stack overflow)的错误。

  2. 无随机访问:栈的特点是只能在栈顶进行插入和删除操作,没有提供随机访问的能力。如果需要访问或修改栈中的其他元素,必须先将栈顶的元素弹出,直到达到目标位置。

  3. 不灵活:栈的特性决定了它的使用场景受到一定的限制。对于需要随机访问、频繁插入和删除的场景,栈可能不是最佳选择。

二.栈的功能

栈作为一种数据结构,具有以下几个主要的功能:

  1. 入栈:将元素添加到栈的顶部(栈顶)。新元素成为栈顶,原有的栈顶元素依次向下移动。入栈操作可以用于将数据添加到栈中。

  2. 出栈:从栈的顶部(栈顶)移除元素。被移除的元素是最后一个入栈的元素,即栈顶元素。出栈操作会改变栈的结构,并返回被移除的元素。

  3. 获取栈顶元素:获取栈顶的元素,但不对栈进行修改。这个操作可以让我们查看栈顶的元素,而不改变栈的结构。

  4. 判断栈是否为空:检查栈是否不包含任何元素。如果栈中没有元素,即栈为空,该函数返回真;否则,返回假。

  5. 判断栈是否已满:检查栈是否已达到其容量上限。对于基于数组实现的栈,如果数组已满,即栈已满,该函数返回真;否则,返回假。

三.栈的实现

1.创建栈

创建一个结构体,里面的成员是数组以及指针。(在这里,为了大家能够方便理解,用静态的顺序表来实现)

#include <stdio.h>
#define MAX_SIZE 100typedef struct {int data[MAX_SIZE]; // 用于存储栈中的元素int top; // 栈顶指针,指向栈顶元素的索引
} Stack;

2.初始化栈

将栈顶的指针初始化为-1,表示此栈为空。

// 初始化栈
void initStack(Stack* stack) {stack->top = -1; // 栈顶指针初始化为-1,表示栈为空
}

3.判断栈是否为空

判断栈是否为空。如果栈顶指针top等于-1,表示栈为空,返回1;否则,返回0。

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

4. 判断是否已满

判断栈是否已满。如果栈顶指针top等于数组最大索引(MAX_SIZE - 1),表示栈已满,返回1;否则,返回0。

// 判断栈是否已满
int isFull(Stack* stack) {
return stack->top == MAX_SIZE - 1; // 栈满时,栈顶指针等于数组最大索引
}

5.入栈

 入栈操作。首先使用isFull函数检查栈是否已满,如果已满,则打印错误信息并返回;否则,将栈顶指针top加1,并将元素item放入栈顶位置data[top]

// 入栈
void push(Stack* stack, int item) {
if (isFull(stack)) {
printf("Stack overflow!\n"); // 栈已满,无法入栈
return;
}
stack->data[++stack->top] = item; // 栈顶指针加1,并将元素放入栈顶
}

 6.出栈

出栈操作。首先使用isEmpty函数检查栈是否为空,如果为空,则打印错误信息并返回-1;否则,返回栈顶元素data[top],并将栈顶指针top减1。

// 出栈
int pop(Stack* stack) {
if (isEmpty(stack)) {
printf("Stack underflow!\n"); // 栈为空,无法出栈
return -1;
}
return stack->data[stack->top--]; // 返回栈顶元素,并将栈顶指针减1
}

 7.获取栈顶元素

获取栈顶元素。首先使用isEmpty函数检查栈是否为空,如果为空,则打印错误信息并返回-1;否则,返回栈顶元素data[top],但不修改栈的结构。

/ 获取栈顶元素
int peek(Stack* stack) {
if (isEmpty(stack)) {
printf("Stack is empty!\n"); // 栈为空,无栈顶元素
return -1;
}
return stack->data[stack->top]; // 返回栈顶元素,不修改栈的结构
}

8.打印栈中元素

 打印栈中的元素。首先使用isEmpty函数检查栈是否为空,如果为空,则打印提示信息;否则,使用循环从栈底到栈顶依次打印栈中的元素。

/ 打印栈中的元素(用于调试)
void printStack(Stack* stack) {
if (isEmpty(stack)) {
printf("Stack is empty!\n");
return;
}
printf("Stack: ");
for (int i = 0; i <= stack->top; i++) {
printf("%d ", stack->data[i]);
}
printf("\n");
}

四.栈的源码呈现

 

#include <stdio.h>
#define MAX_SIZE 100typedef struct {int data[MAX_SIZE]; // 用于存储栈中的元素int top; // 栈顶指针,指向栈顶元素的索引
} Stack;// 初始化栈
void initStack(Stack* stack) {stack->top = -1; // 栈顶指针初始化为-1,表示栈为空
}// 判断栈是否为空
int isEmpty(Stack* stack) {return stack->top == -1; // 栈为空时,栈顶指针为-1
}// 判断栈是否已满
int isFull(Stack* stack) {return stack->top == MAX_SIZE - 1; // 栈满时,栈顶指针等于数组最大索引
}// 入栈
void push(Stack* stack, int item) {if (isFull(stack)) {printf("Stack overflow!\n"); // 栈已满,无法入栈return;}stack->data[++stack->top] = item; // 栈顶指针加1,并将元素放入栈顶
}// 出栈
int pop(Stack* stack) {if (isEmpty(stack)) {printf("Stack underflow!\n"); // 栈为空,无法出栈return -1;}return stack->data[stack->top--]; // 返回栈顶元素,并将栈顶指针减1
}// 获取栈顶元素
int peek(Stack* stack) {if (isEmpty(stack)) {printf("Stack is empty!\n"); // 栈为空,无栈顶元素return -1;}return stack->data[stack->top]; // 返回栈顶元素,不修改栈的结构
}// 打印栈中的元素(用于调试)
void printStack(Stack* stack) {if (isEmpty(stack)) {printf("Stack is empty!\n");return;}printf("Stack: ");for (int i = 0; i <= stack->top; i++) {printf("%d ", stack->data[i]);}printf("\n");
}// 主函数用于测试栈的功能
int main() {Stack stack;initStack(&stack); // 初始化栈push(&stack, 10);push(&stack, 20);push(&stack, 30);printStack(&stack); // 打印栈中的元素printf("Top element: %d\n", peek(&stack)); // 获取栈顶元素while (!isEmpty(&stack)) {printf("Popped element: %d\n", pop(&stack)); // 依次出栈并输出元素}return 0;
}

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

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

相关文章

区块链技术:DAPP开发

随着科技的飞速发展&#xff0c;区块链技术逐渐渗透到各个领域&#xff0c;其中DAPP&#xff08;去中心化应用&#xff09;的发展尤为引人注目。作为一种新型的应用程序&#xff0c;DAPP正在重塑未来商业生态&#xff0c;其潜力无可估量。 一、DAPP的定义和特点 DAPP是指基于…

基于ssm+vue+Mysql的房屋租赁系统求租合同

开发语言&#xff1a;Java框架&#xff1a;ssmJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.…

交通运输智慧监管平台---强化物流安全与效率的新举措

一、建设背景 随着社会对于交通安全和环境保护的要求不断提高&#xff0c;对卡车运输的监管和合规性要求也逐渐加强。为了满足快速发展的物流需求&#xff0c;提高供应链协同和可追溯性、解决安全问题、提高运输效率和降低成本&#xff0c;我们利用现代技术和信息化手段着力建设…

ctfshow——SQL注入

文章目录 SQL注入基本流程普通SQL注入布尔盲注时间盲注报错注入——extractvalue()报错注入——updataxml()Sqlmap的用法 web 171——正常联合查询web 172——查看源代码、联合查询web 173——查看源代码、联合查询web 174——布尔盲注web 176web 177——过滤空格web 178——过…

nginx下载安装配置(含ssl)

下载安装环节 wget https://nginx.org/download/nginx-1.24.0.tar.gz tar -zxvf xxx.tar.gz yum -y install pcre-devel openssl openssl-devel ./configure --prefix/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream make & make i…

HTTP协议 --中

http状态码 当浏览者访问一个网页时&#xff0c;浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前&#xff0c;此网页所在的服务器会返回一个包含HTTP 状态码的信息头&#xff08; server header &#xff09;用以响应浏览器的请求。 HTTP 状态码的英文为…

【面试经典 150 | 数组】接雨水

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;预处理方法二&#xff1a;单调栈方法三&#xff1a;双指针 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff…

AI大模型日报#0430:疑似GPT4.5模型刷屏、上交实现「蛋白质功能定向进化」、微软紧急撤回WizardLM-2

导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了今日要点以及每条资讯的摘要。 《AI大模型日报》今日要点&#xff1a; 在AI大模型领域&#xff0c;多项研究进展和行业应用动态引发关注。一夜之间&#x…

Opencv_14_多边形填充与绘制

绘制多边形&#xff1a; 1&#xff09;coInvert.polyline_drawing(src); 2&#xff09;void ColorInvert::polyline_drawing(Mat& image) { Mat canvas Mat::zeros(Size(512, 512), CV_8UC3); Point p1(100, 100); Point p2(150, 100); Point p3(200…

vue3 安装-使用之第一篇

首先需要node版本高于V16.14.1 安装 执行 npm create vitelatest 具体选择按照自己实际需要的来 Project name:项目名称 Select a framework:选择用哪种框架 &#xff08;我选择vue&#xff09; Select a variant: 选择用JS还是TS&#xff08;我选择JS&#xff09;找到项目&…

kotlinDSL控制的安卓项目导入已存在的模块后sync报错

原因很明显&#xff0c;但是我还找了好久 因为在import时并没有选择groove还是kotlin控制&#xff0c; 所以默认为groovy控制的&#xff0c;然而主项目是由kotlin dsl控制的grale行为。 原因清楚之后&#xff0c;就可以去检查一下&#xff0c;项目里是否包含了settings.gradle和…

rk3588部署yolov8视频目标检测教程

1. 环境配置 1.1 训练和导出onnx环境 #使用conda创建一个python环境 conda create -n torch python3.9#激活环境 conda activate torch#安装yolov8 pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple 1.2 导出rknn环境 安装toolkit2-1.5.2 下载链接&am…

使用 LlamaIndex 和 Llama 2-Chat 构建知识驱动的对话应用程序

文章目录 使用 LlamaIndex 和 Llama 2-Chat 构建知识驱动的对话应用程序Llama 2-70B-聊天LlamaIndex 解决方案概述先决条件使用 SageMaker JumpStart 部署 GPT-J 嵌入模型使用 SageMaker Python SDK 进行部署在 SageMaker Studio 中使用 SageMaker JumpStart 进行部署使用 Sage…

如何查看我的Docker 容器和 `app.py` 脚本有足够的权限来读取 `config.json` 文件

要检查 Docker 容器和 app.py 脚本是否具有读取 config.json 文件的足够权限&#xff0c;你可以按照以下步骤操作&#xff1a; 检查宿主机上的文件权限&#xff1a; 在宿主机上&#xff0c;使用 ls -l 命令查看 config.json 文件的权限。 ls -l /path/to/config.json确保该文件…

聊聊Mysql的两阶段提交

从图中可看出&#xff0c;事务的提交过程有两个阶段&#xff0c;就是将 redo log 的写入拆成了两个步骤&#xff1a;prepare 和 commit&#xff0c;中间再穿插写入bin log&#xff0c;具体如下&#xff1a; prepare 阶段&#xff1a;将 事务的修改写入到 redo log&#xff0c;同…

Java | Leetcode Java题解之第62题不同路径

题目&#xff1a; 题解&#xff1a; class Solution {public int uniquePaths(int m, int n) {long ans 1;for (int x n, y 1; y < m; x, y) {ans ans * x / y;}return (int) ans;} }

设计模式-01 设计模式单例模式

设计模式-01 设计模式单例模式 目录 设计模式-01 设计模式单例模式 1定义 2.内涵 3.使用示例 4.具体代码使用实践 5.注意事项 6.最佳实践 7.总结 1 定义 单例模式是一种设计模式&#xff0c;它确保一个类只能被实例化一次。它通过在类内部创建类的唯一实例并提供一个全…

Mysql从入门到精通——Mysql知识点总结(基础篇)

参考视频 黑马程序员 MySQL数据库入门到精通i 题单推荐 入门 进阶 SQL语句类型 DDL:数据定义语言&#xff0c;用来定义数据库对象(数据库&#xff0c;表&#xff0c;字段)DML:数据操作语言&#xff0c;对数据库表中的数据进行增删改DQL:数据查询语言,用来查询数据库中表的…

SpringCloud 学习笔记 —— 六、Ribbon:负载均衡(基于客户端)

SpringCloud 学习笔记 —— 一、背景-CSDN博客 SpringCloud 学习笔记 —— 二、微服务与微服务架构-CSDN博客 SpringCloud 学习笔记 —— 三、SpringCloud 入门概述-CSDN博客 SpringCloud 学习笔记 —— 四、SpringCloud Rest 学习环境搭建&#xff1a;服务提供者-CSDN博客 …

一站式AI创作平台:融合GPT会话、GPTs应用、Midjourney视觉艺术与Suno AI音乐合成模块

一、系统简介 星河易创AI系统基于ChatGPT的核心技术打造&#xff0c;集成了自然语言问答和艺术创作功能。该系统兼容Midjourney绘画技术&#xff0c;并支持官方GPT模型。它提供了多样化的应用&#xff0c;包括GPTs的多场景应用、实时GPT语音对话能力、GPT-4模型的先进特性&…