【数据结构C/C++】链式存储与顺序存储结构栈
文章目录
- 链式存储结构
- 顺序存储结构
下面这篇文章是我大二时候写的比较详细的实现过程,再这篇文章我也会再一次比较简单的再次简述一下链式与顺序存储结构的实现方式。
链式存储结构与顺序存储结构详解
这里我就不使用C++再一次实现这两个栈了,有兴趣的也可以使用C++的STL库中的stack直接实现。
实现思路如下:
首先,我们定义了一个节点结构Node,每个节点包含一个整数数据和指向下一个节点的指针。
然后,我们定义了栈结构Stack,其中包括一个指向栈顶节点的指针top和一个表示栈大小的整数size。
初始化栈时,将top指针设置为NULL,表示栈为空,同时将size设置为0。
入栈操作(push)创建一个新节点,将数据存储在新节点中,然后将新节点插入到栈顶,并更新top和size。
出栈操作(pop)从栈顶移除一个节点,返回其数据,并释放节点内存,同时更新top和size。
查看栈顶元素操作(peek)返回栈顶节点的数据,不修改栈的状态。
打印栈中元素操作(printStack)遍历栈中的节点,打印每个节点的数据。
主函数中使用一个循环来接收用户输入的选项,然后调用相应的栈操作,以实现增删改查功能。
链式存储结构
#include <stdio.h>
#include <stdlib.h>// 定义节点结构
typedef struct Node {int data;struct Node *next;
} Node;// 定义栈结构
typedef struct Stack {Node *top;int size;
} Stack;// 初始化栈
void initStack(Stack *stack) {stack->top = NULL;stack->size = 0;
}// 入栈操作
void push(Stack *stack, int data) {Node *newNode = (Node *)malloc(sizeof(Node));if (newNode == NULL) {printf("内存分配失败\n");exit(1);}newNode->data = data;newNode->next = stack->top;stack->top = newNode;stack->size++;
}// 出栈操作
int pop(Stack *stack) {if (stack->top == NULL) {printf("栈为空\n");return -1; // 返回一个特殊值表示栈为空}Node *temp = stack->top;int data = temp->data;stack->top = temp->next;free(temp);stack->size--;return data;
}// 查看栈顶元素
int peek(Stack *stack) {if (stack->top == NULL) {printf("栈为空\n");return -1; // 返回一个特殊值表示栈为空}return stack->top->data;
}// 打印栈中的元素
void printStack(Stack *stack) {Node *current = stack->top;printf("栈中的元素: ");while (current != NULL) {printf("%d ", current->data);current = current->next;}printf("\n");
}int main() {Stack stack;initStack(&stack);int choice, data;while (1) {printf("1. 入栈 2. 出栈 3. 查看栈顶元素 4. 打印栈 5. 退出\n");printf("请输入选项: ");scanf("%d", &choice);switch (choice) {case 1:printf("请输入要入栈的数据: ");scanf("%d", &data);push(&stack, data);break;case 2:data = pop(&stack);if (data != -1)printf("出栈的元素是: %d\n", data);break;case 3:data = peek(&stack);if (data != -1)printf("栈顶元素是: %d\n", data);break;case 4:printStack(&stack);break;case 5:exit(0);default:printf("无效选项\n");}}return 0;
}
顺序存储结构
实现思路如下:
首先,我们定义了一个栈结构Stack,其中包括一个指向整数数组的指针array,栈的容量capacity,栈顶索引top,和当前栈中的元素个数size。
初始化栈时,分配内存并初始化Stack结构的字段,包括分配内存给array数组,将top初始化为-1表示栈为空,将size初始化为0。
入栈操作(push)检查栈是否已满,如果没有满,将数据存储在数组中,并更新top和size。
出栈操作(pop)检查栈是否为空,如果不为空,从数组中取出元素,更新top和size,并返回出栈的元素。
查看栈顶元素操作(peek)检查栈是否为空,如果不为空,返回栈顶元素。
打印栈中元素操作(printStack)遍历数组中的元素,打印每个元素。
主函数中使用一个循环来接收用户输入的选项,然后调用相应的栈操作,以实现增删改查功能。
#include <stdio.h>
#include <stdlib.h>// 定义栈结构
typedef struct Stack {int *array; // 用于存储栈元素的数组int capacity; // 栈的容量int top; // 栈顶索引int size; // 当前栈中的元素个数
} Stack;// 初始化栈
Stack* initStack(int capacity) {Stack *stack = (Stack *)malloc(sizeof(Stack));if (stack == NULL) {printf("内存分配失败\n");exit(1);}stack->capacity = capacity;stack->array = (int *)malloc(sizeof(int) * capacity);if (stack->array == NULL) {printf("内存分配失败\n");exit(1);}stack->top = -1; // 初始化栈顶索引为-1,表示栈为空stack->size = 0; // 初始化栈中元素个数为0return stack;
}// 入栈操作
void push(Stack *stack, int data) {if (stack->size >= stack->capacity) {printf("栈已满\n");return;}stack->array[++stack->top] = data;stack->size++;
}// 出栈操作
int pop(Stack *stack) {if (stack->size <= 0) {printf("栈为空\n");return -1; // 返回一个特殊值表示栈为空}int data = stack->array[stack->top--];stack->size--;return data;
}// 查看栈顶元素
int peek(Stack *stack) {if (stack->size <= 0) {printf("栈为空\n");return -1; // 返回一个特殊值表示栈为空}return stack->array[stack->top];
}// 打印栈中的元素
void printStack(Stack *stack) {if (stack->size == 0) {printf("栈为空\n");return;}printf("栈中的元素: ");for (int i = 0; i <= stack->top; i++) {printf("%d ", stack->array[i]);}printf("\n");
}int main() {int capacity;printf("请输入栈的容量: ");scanf("%d", &capacity);Stack *stack = initStack(capacity);int choice, data;while (1) {printf("1. 入栈 2. 出栈 3. 查看栈顶元素 4. 打印栈 5. 退出\n");printf("请输入选项: ");scanf("%d", &choice);switch (choice) {case 1:printf("请输入要入栈的数据: ");scanf("%d", &data);push(stack, data);break;case 2:data = pop(stack);if (data != -1)printf("出栈的元素是: %d\n", data);break;case 3:data = peek(stack);if (data != -1)printf("栈顶元素是: %d\n", data);break;case 4:printStack(stack);break;case 5:free(stack->array);free(stack);exit(0);default:printf("无效选项\n");}}return 0;
}
下面是使用C++的stack库实现的栈,这个相当于没有实现任何功能,考研可不推荐这样子玩,当然如果考察的重点不是栈,而是使用栈解决某个问题,那么可以使用stack
#include <iostream>
#include <stack>using namespace std;int main() {stack<int> myStack;while (true) {int choice, data;cout << "1. 入栈 2. 出栈 3. 查看栈顶元素 4. 打印栈 5. 退出" << endl;cout << "请输入选项: ";cin >> choice;switch (choice) {case 1:cout << "请输入要入栈的数据: ";cin >> data;myStack.push(data);break;case 2:if (!myStack.empty()) {cout << "出栈的元素是: " << myStack.top() << endl;myStack.pop();} else {cout << "栈为空" << endl;}break;case 3:if (!myStack.empty()) {cout << "栈顶元素是: " << myStack.top() << endl;} else {cout << "栈为空" << endl;}break;case 4:if (!myStack.empty()) {cout << "栈中的元素: ";stack<int> tempStack = myStack;while (!tempStack.empty()) {cout << tempStack.top() << " ";tempStack.pop();}cout << endl;} else {cout << "栈为空" << endl;}break;case 5:return 0;default:cout << "无效选项" << endl;}}return 0;
}相关文章:
【数据结构C/C++】链式存储与顺序存储结构栈
文章目录 链式存储结构顺序存储结构 下面这篇文章是我大二时候写的比较详细的实现过程,再这篇文章我也会再一次比较简单的再次简述一下链式与顺序存储结构的实现方式。 链式存储结构与顺序存储结构详解 这里我就不使用C再一次实现这两个栈了,有兴趣的也可…...
【数据库系统概论】数据定义之基本表的定义/创建、修改和删除
前言 🚩定义/创建基本表语法示例 修改基本表语法示例 删除基本表语法示例 感谢 💖 前言 🚩 SQL支持数据库系统的三级模式结构,其模式、外模式和内模式中的基本对象有表、视图和索引,因此,SQL的数据定义功能…...
面试算法22:链表中环的入口节点(1)
题目 如果一个链表中包含环,那么应该如何找出环的入口节点?从链表的头节点开始顺着next指针方向进入环的第1个节点为环的入口节点。 例如,在如图4.3所示的链表中,环的入口节点是节点3。 分析 第1步:确认是否包含环…...
蓝桥杯---第二讲---二分与前缀和
文章目录 前言Ⅰ. 数的范围0x00 算法思路0x00 代码书写 Ⅱ. 数的三次方根0x00 算法思路0x01代码书写 Ⅲ. 前缀和0x00 算法思路0x01 代码书写 Ⅳ. 子矩阵的和0x00 算法思路0x01 代码书写 Ⅴ. 机器人跳跃问题0x00 算法思路0x01 代码书写 Ⅵ. 四平方和0x00 算法思路0x01 代码书写 …...
d3dx9_39.dll如何修复?最新修复d3dx9_39.dll方法分享
大家好!今天我要和大家分享的主题是“d3dx9_39.dll丢失的修复方法”。我们都知道,在使用电脑的过程中,经常会遇到各种问题,而其中最常见的就是文件丢失。d3dx9_39.dll就是其中一个常见的丢失文件。那么,如何修复这个丢…...
阿里云轻量应用服务器月流量限制说明(部分套餐不限流量)
阿里云轻量应用服务器部分套餐限制月流量,轻量应用服务器按照套餐售卖,有的套餐限制月流量,有的不限制流量。像阿里云轻量2核2G3M带宽轻量服务器一年108元和轻量2核4G4M带宽一年297.98元12个月,这两款是不限制月流量的。阿里云百科…...
项目设计:YOLOv5目标检测+机构光相机(intel d455和d435i)测距
1.介绍 1.1 Intel D455 Intel D455 是一款基于结构光(Structured Light)技术的深度相机。 与ToF相机不同,结构光相机使用另一种方法来获取物体的深度信息。它通过投射可视光谱中的红外结构光图案,然后从被拍摄物体表面反射回来…...
WPF中DataContext的绑定技巧
先看效果: 上面的绑定值都是我们自定义的属性,有了以上的提示,那么我们可以轻松绑定字段,再也不用担心错误了。附带源码。 目录 1.建立mvvm项目 2.cs后台使用DataContext绑定 3.xaml前台使用DataContext绑定 4.xaml前台使用Da…...
【Spring MVC研究】MVC原理:DispatcherServlet的初始化,初始化好等于MVC准备好
文章目录 1. EnableWebMVC 开启 MVC 功能2. 初始化自定义的 MVC 组件2.1. 初始化过程2.2. 如何分析复杂的 Spring 组件注册 3. 容器启动后会初始化 DispatcherServlet4. DispatcherServlet 初始化过程总结5. 资料参考 把DispatcherServlet 准备好意味着服务器已经可以处理请求了…...
Kafka的分布式架构与高可用性
导语 一开始我们就说过Kafka是一款开源的高吞吐、分布式的消息队列系统,那么今天我们就来说下它的分布式架构和高可用性以及双/多中心部署。 Kafka 体系架构简介 以下是 Kafka 的软件架构,整个 Kafka 体系结构由 Producer、Consumer、Broker、ZooKeepe…...
Spring Cloud学习笔记【分布式请求链路跟踪-Sleuth】
文章目录 Spring Cloud Sleuth概述概述主要功能:Sleuth中的术语和相关概念官网 zipkin配置下载运行zipkin下载zipkin运行 demo配置服务提供者 lf-userpom.xmlapplication.ymlUserController 服务调用者 lf-authpom.xmlapplication.ymlAuthController 测试 Spring Cl…...
Java开发中的操作日志详解(InsCode AI 创作助手)
Java开发中的操作日志详解 一、操作日志的作用 故障排除和调试: 操作日志可以记录应用程序的各种活动,包括错误、异常、警告和信息性消息。这有助于开发人员快速定位和解决问题。性能分析: 通过记录关键操作和性能指标,操作日志…...
FutureTask和CompletableFuture的模拟使用
模拟了查询耗时操作,并使用FutureTask和CompletableFuture分别获取计算结果,统计执行时长 package org.alllearn.futurtask;import com.google.common.base.Stopwatch; import com.google.common.collect.Lists; import lombok.AllArgsConstructor; imp…...
Redis作为缓存,mysql的数据如何与redis进行同步?
Redis作为缓存,mysql的数据如何与redis进行同步? 一定要设置前提,先介绍业务背景 延时双删 双写一致性:当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致 读操作:缓存命中,直接返回;缓存未…...
申请免费 SSL 证书为您的小程序加密通信
在今天的网络环境中,数据安全和隐私保护变得尤为重要。无论是网站还是应用程序,为其提供安全的通信渠道都是至关重要的。对于小程序开发者来说,使用 SSL(Secure Sockets Layer)证书可以有效地保障用户数据的安全&#…...
Go 并发编程
并发编程 1.1 并发与并⾏ 并⾏与并发是两个不同的概念,普通解释: 并发:交替做不同事情的能⼒并⾏:同时做不同事情的能⼒ 如果站在程序员的⻆度去解释是这样的: 并发:不同的代码块交替执⾏并⾏…...
鱼眼相机去畸变(图像拉直/展开/矫正)算法及实战总结
本文介绍两种方法 1、经纬度矫正法 2、棋盘格矫正法 一、经纬度矫正法 1、算法说明 经纬度矫正法, 可以把鱼眼图想象成半个地球, 然后将地球展开成地图,经纬度矫正法主要是利用几何原理, 对图像进行展开矫正。 经过P点的入射光线…...
es6 数据类型
es6 数据类型 map 数据类型 >Map 对象保存键值对。 用途 : Object的key无法支持该数据时需要了解对象大小时 map 数据类型任何值(对象或者原始值) 都可以作为一个键。 Object 的键只能是字符串 let myMap new Map(); let myMap1 new Map(); var keyStrin…...
【postgresql】
看到group by 1,2 和 order by 1, 2。看不懂,google,搜到了Stack Overflow 上有回答 What does SQL clause “GROUP BY 1” mean? 大概意思就是,group by, order by 后面跟数字,指的是 selec…...
【C++】空间配置器 allocator:原理及底层解析
文章目录 空间配置器一级空间配置器二级空间配置器1. 内存池2. SGI-STL中二级空间配置器设计 - - 哈希桶3. 二级空间配置器的空间申请 空间配置器的默认选择空间配置器的在封装:添加了数据类型大小空间配置器对象的构造与析构 容器中的 allocator 空间配置器 提到空…...
[特殊字符] iONSPlayer 发布,ONScripter游戏的iOS模拟器
🎮 iONSPlayer 发布,ONScripter游戏的iOS模拟器 阿丰在长春 一只特立独行的丰子 什么是 iONSPlayer?继承自ONSPlayer! iONSPlayer 是一款运行在 iOS 设备上的 ONScripter 引擎模拟器。 简单来说,它可以让你在 iPhon…...
实战指南:基于快马AI开发具备核心功能的电商比价插件
最近在做一个电商比价插件的开发项目,正好用到了InsCode(快马)平台,整个过程特别顺畅,分享下我的实战经验。 项目背景与需求分析 电商比价插件是很多网购达人的刚需工具。核心要解决三个问题:实时比价、历史价格追踪和降价提醒。传…...
效率飞跃:用快马平台快速测试与集成Copaw生成的用户认证模块
最近在开发一个需要用户系统的项目时,遇到了一个常见问题:如何快速验证从Copaw下载的认证模块代码是否真的能正常工作?传统方式需要手动搭建测试环境、配置数据库、编写测试用例,整个过程耗时耗力。直到发现了InsCode(快马)平台&a…...
github上传项目代码手把手运行,包含部分坑
git config --global init.defaultBranch main 自定义默认分支名称,远程分支是main git init(默认是master) git config --global init.defaultBranch main(以后默认使用main) git push -f origin main (强制覆盖…...
Minecraft启动器与游戏配置工具全攻略:从新手到大师的进阶指南
Minecraft启动器与游戏配置工具全攻略:从新手到大师的进阶指南 Minecraft启动器是每一位玩家进入方块世界的第一道门,而一款优秀的游戏配置工具则能让你的冒险之旅更加顺畅。本文将以玩家视角,带你深入了解如何利用PCL2-CE这款强大的开源工具…...
OpenCV透视变换实战:从文档矫正到AR应用
1. 透视变换基础:从原理到生活场景 想象一下你正在用手机拍摄一张放在桌上的发票,由于角度问题,发票在照片里变成了梯形。这时候你需要的正是透视变换——它能把这个梯形"掰正"成规整的矩形。在计算机视觉领域,透视变换…...
别再只用BCE了!用PyTorch实现ASL损失函数,搞定多标签分类中的样本不均衡
多标签分类新范式:PyTorch实战ASL损失函数解决样本不均衡难题 在图像标注、医学诊断或文本情感分析等多标签分类任务中,我们常常遇到一个棘手问题——某些标签的出现频率可能比其他标签高出几个数量级。想象一下,当你构建一个商品标签系统时&…...
利用快马平台快速构建鸿蒙pc镜像下载验证工具原型
最近在研究鸿蒙系统的PC版本适配工作,发现获取官方镜像是个不小的门槛。官方渠道的下载链接分散在不同页面,版本信息也不够直观,每次下载完还得手动校验文件完整性,整个过程相当繁琐。于是想做个工具来简化这个流程,正…...
效率提升300%:OpenClaw+Phi-3-vision-128k-instruct重构我的学术工作流
效率提升300%:OpenClawPhi-3-vision-128k-instruct重构我的学术工作流 1. 从手动到自动的学术工作流革命 作为一名每天需要处理大量文献、实验数据和演示材料的科研工作者,我曾经花费近40%的工作时间在重复性文档处理上——截图标注、图表整理、笔记归…...
森利威尔SL3041B替换LM5018 100V降压3.3V5V12V恒压芯片
在工业、汽车及电池供电的电子系统中,高压降压转换器的选择往往需要在性能、可靠性与成本之间取得平衡。传统上,LM5018等进口芯片凭借其高输入电压范围和稳定的性能占据一定市场,但随着国内半导体技术的成熟,国产替代方案已具备与…...
