news 2026/4/18 3:23:52

c语言——栈和队列

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
c语言——栈和队列

1.栈


1.1栈的概念及结构

1.1.1概念


:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(LastInFirstOut)的则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。

1.1.2结构

数组栈


链式栈
如果用尾做栈顶,尾插尾删,要设计成双向链表,否则删除数据效率低
如果用头做栈顶,头插头删,就可以设计成单链表

两种都可以,非要选一种,数组栈结构稍微好一点。

1.2接口函数

//要改变结构体的内容 //传结构体的指针 void StackInit(ST* ps); void StackDestory(ST* ps); void StackPush(ST* ps,STDataType x); void StackPop(ST* ps); STDataType StackTop(ST* ps); //取栈顶的数据 int StackSize(ST* ps); //栈中元素个数 bool StackEmpty(ST* ps); //判断栈是否为空

1.3详细代码

#pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<stdbool.h> typedef int STDataType; typedef struct Stack { STDataType* a; int top;//栈顶 int capacity; }ST; void StackInit(ST* ps) { assert(ps); ps->a = NULL; ps->top = 0; //初始化时,top给的是0, // 意味着top指向栈顶数据的下一个 // ps->top=-1; //初始化时,top给的是 - 1, // 意味着top指向栈顶数据 ps->capacity = 0; } void StackDestory(ST* ps) { assert(ps); free(ps->a); ps->a = NULL; ps->top = 0; ps->capacity = 0; } void StackPush(ST* ps, STDataType x) { assert(ps); if (ps->top == ps->capacity) { int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2; STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newCapacity); if (tmp == NULL) { printf("realloc fail\n"); exit(-1); } ps->a = tmp; ps->capacity = newCapacity; } ps->a[ps->top] = x; ps->top++; } void StackPop(ST* ps) { assert(ps); assert(ps->top > 0); //栈不为空才能删 ps->top--; } STDataType StackTop(ST* ps) { assert(ps); assert(ps->top > 0); //栈不为空才能取栈顶元素 return ps->a[ps->top - 1]; } int StackSize(ST* ps) { assert(ps); return ps->top; } bool StackEmpty(ST* ps) { assert(ps); /* if (ps->top == 0) return true; else return false; */ return ps->top == 0; } void TestStack() { ST st; StackInit(&st); StackPush(&st, 1); StackPush(&st, 2); StackPush(&st, 3); StackPush(&st, 4); //遍历栈中的数据 while (!StackEmpty(&st)) { printf("%d ", StackTop(&st)); StackPop(&st); } StackDestory(&st); } int main() { TestStack(); return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/7 18:00:31

Activiti7工作流(五)流程操作

文章目录1、流程定义1.1、概述1.2、.bpmn文件2、流程定义部署2.1、概述2.2、单个文件部署方式2.3、压缩包部署方式2.4、操作数据表3、启动流程实例3.1、概述3.2、操作数据表4、任务查询5、流程任务处理6、流程定义信息查询7、流程删除8、流程资源下载9、流程历史信息的查看1、流…

作者头像 李华
网站建设 2026/4/16 13:58:27

U-boot 源码结构

U-Boot 的源代码采用模块化分层设计&#xff0c;其文件结构清晰划分功能模块&#xff0c;以下是典型源码树的核心目录解析&#xff08;以最新稳定版为例&#xff09;&#xff1a;顶级目录结构概览 u-boot/ ├── arch/ # 处理器架构相关代码 ├── board/ #…

作者头像 李华
网站建设 2026/4/16 15:18:30

【LeetCode热题100(76/100)】划分字母区间

题目地址&#xff1a;链接 思路&#xff1a; 使用map记录最远字符串的地址重新遍历&#xff0c;如果当前内容等于最远字符串地址&#xff0c;那么入队列 function partitionLabels(s: string): number[] {let ans [];const n s.length;const map new Map();for(let i 0;…

作者头像 李华
网站建设 2026/4/10 22:34:31

Python编程语言面试问题二

Python 元组面试问题 Python 中的元组是什么&#xff1f; 在 Python 中&#xff0c;元组是用于存储多个项的不可变序列。创建后无法修改&#xff0c;且通过参数定义。元组适合固定的元素集合。 Python 中元组和列表有什么区别&#xff1f; 列表和元组的主要区别是 − 列表被…

作者头像 李华
网站建设 2026/4/12 5:20:10

【接口测试】1_Postman _Postman环境搭建

文章目录一、简介二、Postman安装和插件newman2.1 Postman安装2.1.1 Postman安装方式2.1.2 Postman注意事项2.2 安装Postman插件newman2.2.1 安装node.js2.2.2 安装newman (前提&#xff1a;确保 npm -v 验证通过)2.2.2.1 npm install报错ERR code ETIMEDOUT的解决办法2.2.2.2 …

作者头像 李华
网站建设 2026/4/15 7:41:58

【接口测试】2_Postman _Postman基础使用

文章目录一、Postman介绍和用例集创建二、基本使用-案例2.1 案例一2.2 案例二2.3 案例三一、Postman介绍和用例集创建 简介&#xff1a;一款接口的调试和测试工具。开发和测试工程师都可以使用。 支持所有主流系统。 特点︰支持MAC、Windows和Linux官网地址: https://www.get…

作者头像 李华