当前位置: 首页 > news >正文

【数据结构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++】链式存储与顺序存储结构栈

文章目录 链式存储结构顺序存储结构 下面这篇文章是我大二时候写的比较详细的实现过程&#xff0c;再这篇文章我也会再一次比较简单的再次简述一下链式与顺序存储结构的实现方式。 链式存储结构与顺序存储结构详解 这里我就不使用C再一次实现这两个栈了&#xff0c;有兴趣的也可…...

【数据库系统概论】数据定义之基本表的定义/创建、修改和删除

前言 &#x1f6a9;定义/创建基本表语法示例 修改基本表语法示例 删除基本表语法示例 感谢 &#x1f496; 前言 &#x1f6a9; SQL支持数据库系统的三级模式结构&#xff0c;其模式、外模式和内模式中的基本对象有表、视图和索引&#xff0c;因此&#xff0c;SQL的数据定义功能…...

面试算法22:链表中环的入口节点(1)

题目 如果一个链表中包含环&#xff0c;那么应该如何找出环的入口节点&#xff1f;从链表的头节点开始顺着next指针方向进入环的第1个节点为环的入口节点。 例如&#xff0c;在如图4.3所示的链表中&#xff0c;环的入口节点是节点3。 分析 第1步&#xff1a;确认是否包含环…...

蓝桥杯---第二讲---二分与前缀和

文章目录 前言Ⅰ. 数的范围0x00 算法思路0x00 代码书写 Ⅱ. 数的三次方根0x00 算法思路0x01代码书写 Ⅲ. 前缀和0x00 算法思路0x01 代码书写 Ⅳ. 子矩阵的和0x00 算法思路0x01 代码书写 Ⅴ. 机器人跳跃问题0x00 算法思路0x01 代码书写 Ⅵ. 四平方和0x00 算法思路0x01 代码书写 …...

d3dx9_39.dll如何修复?最新修复d3dx9_39.dll方法分享

大家好&#xff01;今天我要和大家分享的主题是“d3dx9_39.dll丢失的修复方法”。我们都知道&#xff0c;在使用电脑的过程中&#xff0c;经常会遇到各种问题&#xff0c;而其中最常见的就是文件丢失。d3dx9_39.dll就是其中一个常见的丢失文件。那么&#xff0c;如何修复这个丢…...

阿里云轻量应用服务器月流量限制说明(部分套餐不限流量)

阿里云轻量应用服务器部分套餐限制月流量&#xff0c;轻量应用服务器按照套餐售卖&#xff0c;有的套餐限制月流量&#xff0c;有的不限制流量。像阿里云轻量2核2G3M带宽轻量服务器一年108元和轻量2核4G4M带宽一年297.98元12个月&#xff0c;这两款是不限制月流量的。阿里云百科…...

项目设计:YOLOv5目标检测+机构光相机(intel d455和d435i)测距

1.介绍 1.1 Intel D455 Intel D455 是一款基于结构光&#xff08;Structured Light&#xff09;技术的深度相机。 与ToF相机不同&#xff0c;结构光相机使用另一种方法来获取物体的深度信息。它通过投射可视光谱中的红外结构光图案&#xff0c;然后从被拍摄物体表面反射回来…...

WPF中DataContext的绑定技巧

先看效果&#xff1a; 上面的绑定值都是我们自定义的属性&#xff0c;有了以上的提示&#xff0c;那么我们可以轻松绑定字段&#xff0c;再也不用担心错误了。附带源码。 目录 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是一款开源的高吞吐、分布式的消息队列系统&#xff0c;那么今天我们就来说下它的分布式架构和高可用性以及双/多中心部署。 Kafka 体系架构简介 以下是 Kafka 的软件架构&#xff0c;整个 Kafka 体系结构由 Producer、Consumer、Broker、ZooKeepe…...

Spring Cloud学习笔记【分布式请求链路跟踪-Sleuth】

文章目录 Spring Cloud Sleuth概述概述主要功能&#xff1a;Sleuth中的术语和相关概念官网 zipkin配置下载运行zipkin下载zipkin运行 demo配置服务提供者 lf-userpom.xmlapplication.ymlUserController 服务调用者 lf-authpom.xmlapplication.ymlAuthController 测试 Spring Cl…...

Java开发中的操作日志详解(InsCode AI 创作助手)

Java开发中的操作日志详解 一、操作日志的作用 故障排除和调试&#xff1a; 操作日志可以记录应用程序的各种活动&#xff0c;包括错误、异常、警告和信息性消息。这有助于开发人员快速定位和解决问题。性能分析&#xff1a; 通过记录关键操作和性能指标&#xff0c;操作日志…...

FutureTask和CompletableFuture的模拟使用

模拟了查询耗时操作&#xff0c;并使用FutureTask和CompletableFuture分别获取计算结果&#xff0c;统计执行时长 package org.alllearn.futurtask;import com.google.common.base.Stopwatch; import com.google.common.collect.Lists; import lombok.AllArgsConstructor; imp…...

Redis作为缓存,mysql的数据如何与redis进行同步?

Redis作为缓存&#xff0c;mysql的数据如何与redis进行同步&#xff1f; 一定要设置前提&#xff0c;先介绍业务背景 延时双删 双写一致性:当修改了数据库的数据也要同时更新缓存的数据&#xff0c;缓存和数据库的数据要保持一致 读操作:缓存命中&#xff0c;直接返回;缓存未…...

申请免费 SSL 证书为您的小程序加密通信

在今天的网络环境中&#xff0c;数据安全和隐私保护变得尤为重要。无论是网站还是应用程序&#xff0c;为其提供安全的通信渠道都是至关重要的。对于小程序开发者来说&#xff0c;使用 SSL&#xff08;Secure Sockets Layer&#xff09;证书可以有效地保障用户数据的安全&#…...

Go 并发编程

并发编程 1.1 并发与并⾏ 并⾏与并发是两个不同的概念&#xff0c;普通解释&#xff1a; 并发&#xff1a;交替做不同事情的能⼒并⾏&#xff1a;同时做不同事情的能⼒ 如果站在程序员的⻆度去解释是这样的&#xff1a; 并发&#xff1a;不同的代码块交替执⾏并⾏&#xf…...

鱼眼相机去畸变(图像拉直/展开/矫正)算法及实战总结

本文介绍两种方法 1、经纬度矫正法 2、棋盘格矫正法 一、经纬度矫正法 1、算法说明 经纬度矫正法&#xff0c; 可以把鱼眼图想象成半个地球&#xff0c; 然后将地球展开成地图&#xff0c;经纬度矫正法主要是利用几何原理&#xff0c; 对图像进行展开矫正。 经过P点的入射光线…...

es6 数据类型

​ es6 数据类型 map 数据类型 >Map 对象保存键值对。 用途 &#xff1a; Object的key无法支持该数据时需要了解对象大小时 map 数据类型任何值(对象或者原始值) 都可以作为一个键。 Object 的键只能是字符串 let myMap new Map(); let myMap1 new Map(); var keyStrin…...

【postgresql】

看到group by 1&#xff0c;2 和 order by 1&#xff0c; 2。看不懂&#xff0c;google&#xff0c;搜到了Stack Overflow 上有回答 What does SQL clause “GROUP BY 1” mean? 大概意思就是&#xff0c;group by&#xff0c; order by 后面跟数字&#xff0c;指的是 selec…...

【C++】空间配置器 allocator:原理及底层解析

文章目录 空间配置器一级空间配置器二级空间配置器1. 内存池2. SGI-STL中二级空间配置器设计 - - 哈希桶3. 二级空间配置器的空间申请 空间配置器的默认选择空间配置器的在封装&#xff1a;添加了数据类型大小空间配置器对象的构造与析构 容器中的 allocator 空间配置器 提到空…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...