【数据结构】栈-C语言版
目录
栈的概念
栈的实现
栈的应用
栈的概念
栈的实现
头文件 039-Stack.h
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdbool.h>
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>typedef int STDataType;struct Stack
{STDataType* a;int top;//栈顶,top指向最后一个数据的下一个位置int capacity;//容量,方便增容
};typedef struct Stack Stack;//初始化
void StackInit(Stack* pst);//销毁
void StackDestroy(Stack* pst);//栈顶插入元素
void StackPush(Stack* pst, STDataType x);//栈顶删除元素
void StackPop(Stack* pst);//取栈顶元素
STDataType StackTop(Stack* pst);//判断栈空
bool StackEmpty(Stack* pst);//求栈元素个数
int StackSize(Stack* pst);
源文件 039-Stack.c
#include "039-Stack.h"//初始化
void StackInit(Stack* pst)
{assert(pst);pst->a = (STDataType*)malloc(sizeof(STDataType) * 4);pst->top = 0;pst->capacity = 4;
}//销毁
void StackDestroy(Stack* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->capacity = pst->top = 0;
}//插入元素
void StackPush(Stack* pst, STDataType x)
{assert(pst);if (pst->top == pst->capacity){STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * pst->capacity * 2);if (tmp == NULL){printf("realloc fail\n");exit(-1);}pst->a = tmp;pst->capacity *= 2;}pst->a[pst->top] = x;pst->top++;
}//删除元素
void StackPop(Stack* pst)
{assert(pst);assert(!StackEmpty(pst));pst->top--;
}//返回栈顶元素
STDataType StackTop(Stack* pst)
{assert(pst);assert(!StackEmpty(pst));return pst->a[pst->top - 1];
}//判断栈是否已满,空返回1,非空返回0
bool StackEmpty(Stack* pst)
{assert(pst);return pst->top == 0;
}//求栈中元素个数
int StackSize(Stack* pst)
{assert(pst);return pst->top;
}
测试文件 039-test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "039-Stack.h"void TestStack()
{Stack st;StackInit(&st);StackPush(&st, 1);StackPush(&st, 2);StackPush(&st, 3);while (!StackEmpty(&st)){printf("%d ", StackTop(&st));StackPop(&st);}StackDestroy(&st);}
int main()
{TestStack();return 0;
}
栈的应用
1.有效的括号 OJ链接
分析:
(1)将栈的实现可以直接copy进去(返回栈顶元素需要做小小的改动:如果栈为空,不能直接assert断言终止,而要返回'\0'),后面只需要实现括号的匹配即可。
(2)如何实现括号匹配?如果是左括号,那么入栈,如果是右括号就判断栈顶元素该右括号是否能够匹配,如果可以就从栈里弹出一个左括号,如果不匹配就直接返回false。
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdbool.h>
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>typedef int STDataType;
struct Stack
{STDataType* a;int top;//栈顶,top指向最后一个数据的下一个位置int capacity;//容量,方便增容
};typedef struct Stack Stack;//初始化
void StackInit(Stack* pst);//销毁
void StackDestroy(Stack* pst);//栈顶插入元素
void StackPush(Stack* pst, STDataType x);//栈顶删除元素
void StackPop(Stack* pst);//取栈顶元素
STDataType StackTop(Stack* pst);//判断栈空
bool StackEmpty(Stack* pst);//求栈元素个数
int StackSize(Stack* pst);//初始化
void StackInit(Stack* pst)
{assert(pst);pst->a = (STDataType*)malloc(sizeof(STDataType) * 4);pst->top = 0;pst->capacity = 4;
}//销毁
void StackDestroy(Stack* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->capacity = pst->top = 0;
}//插入元素
void StackPush(Stack* pst, STDataType x)
{assert(pst);if (pst->top == pst->capacity){STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * pst->capacity * 2);if (tmp == NULL){printf("realloc fail\n");exit(-1);}pst->a = tmp;pst->capacity *= 2;}pst->a[pst->top] = x;pst->top++;
}//删除元素
void StackPop(Stack* pst)
{assert(pst);assert(!StackEmpty(pst));pst->top--;
}//返回栈顶元素
STDataType StackTop(Stack* pst)
{assert(pst);if(StackEmpty(pst)){return '\0';}//assert(!StackEmpty(pst));return pst->a[pst->top - 1];
}//判断栈是否已满,空返回1,非空返回0
bool StackEmpty(Stack* pst)
{assert(pst);return pst->top == 0;
}//求栈中元素个数
int StackSize(Stack* pst)
{assert(pst);return pst->top;
}bool isValid(char * s) {Stack st;StackInit(&st);while (*s){//左括号入栈if (*s == '(' || *s == '[' || *s == '{'){StackPush(&st, *s);s++;//迭代}else{if (StackEmpty(&st)){return false;}//右括号找最近的左括号匹配char top = StackTop(&st);if (top == '(' && *s != ')'|| top == '[' && *s != ']'|| top == '{' && *s != '}'){StackDestroy(&st);return false;}else{//匹配就弹出左括号StackPop(&st);s++;//迭代 }}}bool ret = StackEmpty(&st);StackDestroy(&st);return ret;
}
【数据结构】栈-C语言版相关推荐
- 表达式求值(数据结构栈,c语言版)
表达式求值 一.实验题目 1.案例分析 2.案例实现 3.算法步骤 4.算法描述 二.工具环境 三.实验问题 四.实验代码 一.实验题目 1.案例分析 任何一个表达式都是由操作数(operand)运算 ...
- 数据结构(C语言版) 第 三 章 栈与队列 知识梳理 + 作业习题详解
目录 一.栈 0.栈的基本概念 1.栈的实现 2.栈与递归 3.Hanoi塔问题 二.队列 0.队列的基本概念 1.队列的实现 2.循环队列 2.1循环队列的相关条件和公式: 3.链队列 4.链队列完 ...
- 资料分享:送你一本《数据结构(C语言版)》电子书!
要想写出可复用.可扩展.易维护.灵活性好的代码,「数据结构」这一关必须要过啊! 在数据结构与算法的众多教材中,奉为经典的当属清华大学严蔚敏老师的著作.很多学校也选择这本书作为考研指定教材. 正在学习数 ...
- 资料分享:送你一本《数据结构(C#语言版)》电子书!
对于信息类专业的学生而言,数据结构与算法是一门必修的课程.只有学好这门课程,熟练掌握线性表.栈.队列.树.图等基本结构,以及在这些结构上的各种算法,才能利用计算机去解决实际问题. 如何学好这门课程呢, ...
- 数据结构(C语言版) 第 六 章 图 知识梳理 + 习题详解
目录 一. 图的基本定义和术语 一.图的基本概念 1.度 2.连通 (1)连通图 (2)强连通/强连通图 3.回路 4.完全图 二.图的三种存储结构 1.邻接矩阵表示法 2.邻接表(链式)表示法 3. ...
- 数据结构(C语言版 第2版)课后习题答案 严蔚敏 等 编著
数据结构(C语言版 第2版)课后习题答案 严蔚敏 等 编著,仅供参考,还是自己认真做了再看 第1章 绪论 5.选择题 (1)在数据结构中,从逻辑上可以把数据结构分成( C ). A.动态结构和静态 ...
- 严蔚敏版数据结构(C语言版)算法实现代码
严蔚敏版数据结构(C语言版)算法实现代码 数据结构(C语言版)代码实现 线性表 顺序表 链表 单向链表 静态链表01 静态链表02 双向循环链表 栈与队列 栈 顺序栈 进制转换 行编辑器 未完待续.. ...
- 数据结构(C语言版 第2版)课后习题答案 严蔚敏版
数据结构(C语言版 第2版)课后习题答案 严蔚敏 等 编著,仅供参考,还是自己认真做了再看 第1章 绪论 5.选择题 (1)在数据结构中,从逻辑上可以把数据结构分成( C ). A.动态结构和静态 ...
- <初识数据结构+算法实现>数据结构(C语言版)
新晓本已悦人心,故知更加理解深! 目录 前言: ●本篇博文基于<数据结构>(C语言版)严蔚敏教授.吴伟民教授.李冬梅教授编著的教材知识及框架主线,以及参考借阅其他相关资料,结合作者的学习所 ...
- 数据结构(C语言版 严蔚敏 编著)课后习题答案
转自 https://blog.csdn.net/Bamboo_shui/article/details/72433523 (原文没第八章答案) 数据结构(C语言版 第2版)课后习题答案 严蔚敏 ...
最新文章
- 为什么Java要把字符串设计成不可变的
- usaco Mother's Milk
- 2018-2019-1 20165318 20165322 20165326 实验一 开发环境的熟悉
- P1067 多项式输出(模拟)
- 2016. 增量元素之间的最大差值
- SQL SERVER数据库的简单介绍
- 软件接口测试一个项目的实战,全网最全postman接口测试教程和接口项目实战~从入门到精通!!!...
- [NFrog]工具(NHibernate)终于成形了
- Java各种规则引擎
- 19. 卫健委官网医院查询爬虫+验证码识别(云打码)综合案例
- NYOJ 1016 德莱联盟(计算几何 线段相交判定)
- 【老生谈算法】matlab实现RSA算法源码——RSA算法
- Java必学的工具库,让你的代码量减少90%
- 糖友秦女士反映时刻注意自己的饮食太痛苦了
- 7.3 有源滤波电路(2)
- 基于leftlet的旅游地图相册
- GD32F407移植SR8201F
- 牛客寒假算法基础集训营6 I wzoi
- 微信中打开网页,链接无法跳转处理
- 国产数据库比较之大数据分析
热门文章
- 分布式事务之TX-LCN
- 机器学习服务助应用内文本语种在线和离线检测
- ZCU104开发板MIPI摄像头开发(详细介绍移植ZCU102example design)
- 后台管理系统——登录功能
- eclipse中文语言包安装(别看网上那些乱七八糟的,我这个最简单)
- 大数据核心技术是什么
- REDIS11_HyperLogLog的概述、基本命令、UV、PV、DAU、MAU、首页UV如何进行统计处理
- MaxEnt运行报错的各种问题及解决方法
- 用计算机算法拼拼图,算法 – “拼图拼图”拼图
- python中.mat的图像数据怎么转换为.npy的数据