【C语言/数据结构】栈:从概念到两种存储结构的实现


目录

一、栈的概念

二、栈的两种实现方式

1.顺序表实现栈

2.链表实现栈

三、栈的顺序存储结构及其实现

1.栈的声明

2.栈的初始化

3.栈的销毁

4.栈的压栈

5.栈的弹栈

6.栈的判空

7.返回栈顶元素

8.返回栈的长度

四、栈的链式存储结构及其实现

1.栈的声明

2.栈的初始化

3.栈的销毁

4.栈的压栈

5.栈的弹栈

6.栈的判空

7.返回栈顶元素

8.返回栈的长度


一、栈的概念

  • 栈的定义:栈是一种特殊的线性表;但在概念上又有一些规定,栈只允许在一端进行数据的插入与删除的操作,被称为栈顶,而另一端则被称为栈底
  • 出栈(弹栈):在栈顶进行数据的删除
  • 入栈(压栈):在栈底进行数据的插入      
  • LIFO原则:栈中的数据服从后进先出原则(last in first out)

二、栈的两种实现方式

1.顺序表实现栈

  • 设计思路:将数组下标为0的位置作为栈底,而数组的最大下标(即长度减一)作为栈顶元素可能存在的位置;用top指向栈顶元素下一位置的索引
  • 压栈:栈的压栈操作,即为顺序表的尾插
  • 弹栈:栈的弹栈操作,即为顺序表的尾删
  • 设计优势:避免了数组增加删除数据时候需要移动数据;压栈与弹栈的时间复杂度为O(1)
  • 自身优势:缓冲区的利用率高;用一段连续的物理地址来存储数据
  • 缺点:动态顺序表实现的栈需要扩容,而扩容会导致空间浪费或性能消耗

2.链表实现栈

  • 设计思路:将单链表的尾部作为栈底,将链表的头部作为栈顶;链表的头指针指针栈顶元素的位置
  • 压栈:栈的压栈操作,即为链表的头插
  • 弹栈:栈的弹栈操作,即为链表的头删
  • 设计优势:避免了链表删除数据结点的时候,需要找到该结点的前一个结点;压栈与弹栈的时间复杂度为O(1)
  • 自身优势:没有扩容所带来的空间的浪费与性能的消耗
  • 缺点:缓存利用率不如顺序表高

三、栈的顺序存储结构及其实现

1.栈的声明

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#include<assert.h>#define STDateType int typedef struct Stack
{STDateType* date;int top;int capacity;
}ST;void STInit(ST* st);
void STDestory(ST* st);
void STPush(ST* st, STDateType x);
void STPop(ST* st);
STDateType STTop(ST* st);
bool STEmpty(ST* st);
int STSize(ST* st);

2.栈的初始化

void STInit(ST* st)
{assert(st);st->date = NULL;st->capacity = st->top = 0;
}

3.栈的销毁

void STDestory(ST* st)
{assert(st);free(st->date);st->date = NULL;st->top = 0;st->capacity = 0;
}

4.栈的压栈

void STPush(ST* st, STDateType x)
{assert(st);if (st->top == st->capacity){size_t newcapacity = (st->capacity == 0 ? 4 : 2 * st->capacity);STDateType* tmp = (STDateType*)realloc(st->date, sizeof(STDateType) * newcapacity);if (tmp != NULL){st->date = tmp;st->capacity = newcapacity;}}st->date[st->top++] = x;
}

5.栈的弹栈

void STPop(ST* st)
{assert(st);assert(st->top > 0);st->top--;
}

6.栈的判空

bool STEmpty(ST* st)
{assert(st);return st->top == 0;
}

7.返回栈顶元素

STDateType STTop(ST* st)
{assert(st);assert(st->top > 0);return st->date[st->top - 1];
}

8.返回栈的长度

int STSize(ST* st)
{assert(st);return st->top;
}

四、栈的链式存储结构及其实现

1.栈的声明

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#include<assert.h>typedef int StDateType;typedef struct StackNode
{StDateType date;struct StackNode* next;
}StackNode;typedef struct Stack
{StackNode* top;size_t size;
}Stack;void StackInit(Stack* st);//初始化
void StackDestory(Stack* st);//销毁
void StackPush(Stack* st, StDateType x);//压栈
void StackPop(Stack* st);//弹栈
StDateType StackTop(Stack* st);//读取栈顶元素
bool StackEmpty(Stack* st);//判空
size_t StackSize(Stack* st);//返回栈的长度

2.栈的初始化

void StackInit(Stack* st)
{assert(st);st->top = NULL;st->size = 0;
}

3.栈的销毁

void StackDestory(Stack* st)
{assert(st);while (st->size > 0)StackPop(st);
}

4.栈的压栈

void StackPush(Stack* st, StDateType x)
{assert(st);StackNode* Node = (StackNode*)malloc(sizeof(StackNode));if (!Node){perror("malloc mistake");exit(-1);}Node->date = x;Node->next = NULL;Node->next = st->top;st->top = Node;st->size++;
}

5.栈的弹栈

void StackPop(Stack* st)
{assert(st);assert(st->top);StackNode* tmp = st->top;  st->top = st->top->next;  free(tmp);  st->size--;  
}

6.栈的判空

bool StackEmpty(Stack* st)
{assert(st);return st->top == NULL;
}

7.返回栈顶元素

StDateType StackTop(Stack* st)
{assert(st);return st->top->date;
}

8.返回栈的长度

size_t StackSize(Stack* st)
{assert(st);assert(st->top);return st->size;
}

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

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

相关文章

推荐非常方便的初始配置nginx的开源工具

官网 https://www.digitalocean.com/community/tools/nginx?global.app.langzhCN直接复制base64字符串在 /etc/nginx 目录执行&#xff0c;会自动生成配置文件&#xff0c;最后执行 使用tar解压新的压缩配置 tar -xzvf nginxconfig.io-xxx.com.tar.gz | xargs chmod 0644在…

用Transformers实现简单的大模型文本生成

根据输入的prompt&#xff0c;生成一段指定长度的文字。Llama跑起来太慢了&#xff0c;这里用GPT-2作为列子。 from transformers import GPT2LMHeadModel, GPT2Tokenizer import torchtokenizer GPT2Tokenizer.from_pretrained("gpt2") model GPT2LMHeadModel.fr…

打造清洁宜居家园保护自然生态环境,基于YOLOv7【tiny/l/x】参数系列模型开发构建自然生态场景下违规违法垃圾倾倒检测识别系统

自然生态环境&#xff0c;作为我们人类赖以生存的家园&#xff0c;其健康与否直接关系到我们的生活质量。然而&#xff0c;近年来&#xff0c;一些不法分子为了个人私利&#xff0c;在河边、路边等公共区域肆意倾倒垃圾&#xff0c;严重破坏了环境的健康与平衡。这种行为不仅损…

计算机视觉的应用30-基于深度卷积神经网络CNN模型实现物体表面缺陷检测技术的项目

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用30-基于深度卷积神经网络CNN模型实现物体表面缺陷检测技术的项目主要包括&#xff1a;物体表面缺陷检测技术项目介绍&#xff0c;数据构造&#xff0c;模型介绍。 物体表面缺陷检测技术是工业自动化…

[附源码]剑灵三系可乐6.1_Win服务端_联网+单机搭建

本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行的&#xff0c;踩过的坑都给你们填上了。 如果你是小白也没…

YOLOv9-20240507周更说明|更新MobileNetv4等多种轻量化主干

专栏地址&#xff1a;目前售价售价69.9&#xff0c;改进点70 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 本周已更新说明&#xff1a; ### ⭐⭐更新时间&#xff1a;2024/5/12⭐⭐ 1. YOLOv9…

SQL Server “provider: Named Pipes Provider, error: 40 -无法打开到SQL Server的连接“错误处理

目录 错误提醒解决办法 错误提醒 连接SQL Server时显示如下错误&#xff1a; 解决办法 &#xff08;1&#xff09;首先&#xff0c;打开SQL Server Configuration Manager配置管理器 (2) 停止SQL Server服务 右键点击后&#xff0c;选择【停止】 (3) 启动TCP/IP &…

Co-Driver:基于 VLM 的自动驾驶助手,具有类人行为并能理解复杂的道路场景

24年5月来自俄罗斯莫斯科研究机构的论文“Co-driver: VLM-based Autonomous Driving Assistant with Human-like Behavior and Understanding for Complex Road Scenes”。 关于基于大语言模型的自动驾驶解决方案的最新研究&#xff0c;显示了规划和控制领域的前景。 然而&…

Bittensor怎么挖?手把手教你,使用bitget钱包

4月 Binance 上新 TheBittensorHub (TAO), 这个项目究竟做了什么可以令其在上大舞台前就已经在所有通证中排名前 30&#xff1f; 本文将深度解析。 该项目既不直接贡献数据&#xff0c;也不直接贡献算力。 而是通过区块链网络和激励机制&#xff0c;来对不同的算法进行调度和…

【HarmonyOS】综合应用-《校园通》

概念 本文结合之前的笔记文章知识点&#xff0c;做一个综合性的小应用。 创建一个ArkTS语言的鸿蒙项目&#xff0c;搭建首页面 其界面代码如下&#xff0c;该界面使用了垂直布局&#xff0c;相对布局&#xff0c;轮播布局&#xff0c;以及图片&#xff0c;文本等组件的综合运…

具身智能论文(一)

目录 1. PoSE: Suppressing Perceptual Noise in Embodied Agents for Enhanced Semantic Navigation2. Embodied Intelligence: Bionic Robot Controller Integrating Environment Perception, Autonomous Planning, and Motion Control3. Can an Embodied Agent Find Your “…

免费的国内版 GPT 推荐,5个国产ai工具

提起AI&#xff0c;大家第一个想到的就是GPT。 虽然它确实很厉害&#xff0c;但奈何于我们水土不服&#xff0c;使用门槛有些高。 不过随着GPT的爆火&#xff0c;现在AI智能工具已经遍布到各行各业了&#xff0c;随着时间的推移&#xff0c;国内的AI工具也已经“百花盛放”了…

Pencils Protocol 提供层次化的 Staking,品牌升级不断

Pencils Protocol 是一个 Scroll 生态中的一个综合应用平台&#xff0c;在全新的品牌升级后(原为 Penpad)&#xff0c;其在原有的 LaunchPad 的基础上&#xff0c;进一步向收益聚合器、RWA 等板块进行全新的拓展。目前&#xff0c;Pencils Protocol 生态的整体功能板块包括 Lau…

人脸识别技术在访客管理中的应用

访客办理体系&#xff0c;能够使用于政府、戎行、企业、医院、写字楼等众多场所。在办理时&#xff0c;需求对来访人员身份进行精确认证&#xff0c;才能保证来访人员的进入对被访单位不被外来风险入侵。在核实身份时&#xff0c;比较好的方法就是选用人脸辨认技能&#xff0c;…

bat xcopy 解析

echo off set source_folder"C:\path\to\source" set destination_folder"C:\path\to\destination" set exclude_file"C:\path\to\excluded_folders.txt"REM 创建目标文件夹&#xff08;如果不存在&#xff09; mkdir %destination_folder% 2>…

JDK的串行收集器介绍与优化指南-01

JDK串行收集器概述 定义与背景 串行收集器&#xff08;Serial Collector&#xff09;是Java虚拟机&#xff08;JVM&#xff09;中的一种单线程垃圾收集器&#xff0c;它在垃圾收集过程中会暂停所有工作线程&#xff0c;直至收集完成。它适用于内存资源受限、对吞吐量要求不高…

【玄机平台】应急响应

前言&#xff1a; 感谢玄机平台靶机的提供&#xff0c;让我学到了不少东西 平台题解 &#xff1a; 第一章 应急响应-webshell查杀 1.黑客webshell里面的flag flag{xxxxx-xxxx-xxxx-xxxx-xxxx} ssh连接 下载/var/www/html源码&#xff08;finsehll连直接下&#xff09;压缩丢…

JavaWeb--15 tlias-web-management 黑马程序员 部门管理(修改部门信息)

tlias 1 需求分析和开发规范2 部门管理2.1 查询部门2.2 删除部门2.3 添加部门2.4 更新部门 1 需求分析和开发规范 需求说明–接口文档–思路分析–开发–测试–前后端联调 查看页面原型明确需求 根据页面原型和需求&#xff0c;进行表结构设计、编写接口文档(已提供) 阅读接口…

vue3专栏项目 -- 四、前后端结合(下)

一、async 和 await 1、使用async 和 await 改造异步请求 在接触后端API以后就遇到了越来越多的异步请求&#xff0c;现在我们就使用async 和 await 改造异步请求。 async function是把返回内容包裹成个Promise返回Promise await 它在async function里面才起作用&#xff0…

ini配置文件怎么存取False

1、ini文件介绍 INI文件&#xff08;全称为Initialization File&#xff0c;初始化文件&#xff09;是一种简单的文本文件格式&#xff0c;用于存储配置数据。它广泛应用于操作系统和各种应用程序中&#xff0c;用来保存设置、参数或初始化信息。INI文件的基本结构包括节&…