目录

栈的概念

栈的实现

栈的应用


栈的概念

栈是一种特殊的线性表,只允许在固定的一段进行插入和删除元素操作。进行数据插入和删除的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFOA(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作也叫出栈,出数据也在栈顶。
栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。

栈的实现

头文件 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语言版相关推荐

  1. 表达式求值(数据结构栈,c语言版)

    表达式求值 一.实验题目 1.案例分析 2.案例实现 3.算法步骤 4.算法描述 二.工具环境 三.实验问题 四.实验代码 一.实验题目 1.案例分析 任何一个表达式都是由操作数(operand)运算 ...

  2. 数据结构(C语言版) 第 三 章 栈与队列 知识梳理 + 作业习题详解

    目录 一.栈 0.栈的基本概念 1.栈的实现 2.栈与递归 3.Hanoi塔问题 二.队列 0.队列的基本概念 1.队列的实现 2.循环队列 2.1循环队列的相关条件和公式: 3.链队列 4.链队列完 ...

  3. 资料分享:送你一本《数据结构(C语言版)》电子书!

    要想写出可复用.可扩展.易维护.灵活性好的代码,「数据结构」这一关必须要过啊! 在数据结构与算法的众多教材中,奉为经典的当属清华大学严蔚敏老师的著作.很多学校也选择这本书作为考研指定教材. 正在学习数 ...

  4. 资料分享:送你一本《数据结构(C#语言版)》电子书!

    对于信息类专业的学生而言,数据结构与算法是一门必修的课程.只有学好这门课程,熟练掌握线性表.栈.队列.树.图等基本结构,以及在这些结构上的各种算法,才能利用计算机去解决实际问题. 如何学好这门课程呢, ...

  5. 数据结构(C语言版) 第 六 章 图 知识梳理 + 习题详解

    目录 一. 图的基本定义和术语 一.图的基本概念 1.度 2.连通 (1)连通图 (2)强连通/强连通图 3.回路 4.完全图 二.图的三种存储结构 1.邻接矩阵表示法 2.邻接表(链式)表示法 3. ...

  6. 数据结构(C语言版 第2版)课后习题答案 严蔚敏 等 编著

    数据结构(C语言版 第2版)课后习题答案 严蔚敏 等 编著,仅供参考,还是自己认真做了再看 第1章  绪论 5.选择题 (1)在数据结构中,从逻辑上可以把数据结构分成(  C ). A.动态结构和静态 ...

  7. 严蔚敏版数据结构(C语言版)算法实现代码

    严蔚敏版数据结构(C语言版)算法实现代码 数据结构(C语言版)代码实现 线性表 顺序表 链表 单向链表 静态链表01 静态链表02 双向循环链表 栈与队列 栈 顺序栈 进制转换 行编辑器 未完待续.. ...

  8. 数据结构(C语言版 第2版)课后习题答案 严蔚敏版

    数据结构(C语言版 第2版)课后习题答案 严蔚敏 等 编著,仅供参考,还是自己认真做了再看 第1章  绪论 5.选择题 (1)在数据结构中,从逻辑上可以把数据结构分成(  C ). A.动态结构和静态 ...

  9. <初识数据结构+算法实现>数据结构(C语言版)

    新晓本已悦人心,故知更加理解深! 目录 前言: ●本篇博文基于<数据结构>(C语言版)严蔚敏教授.吴伟民教授.李冬梅教授编著的教材知识及框架主线,以及参考借阅其他相关资料,结合作者的学习所 ...

  10. 数据结构(C语言版 严蔚敏 编著)课后习题答案

    转自 https://blog.csdn.net/Bamboo_shui/article/details/72433523    (原文没第八章答案) 数据结构(C语言版 第2版)课后习题答案 严蔚敏 ...

最新文章

  1. 为什么Java要把字符串设计成不可变的
  2. usaco Mother's Milk
  3. 2018-2019-1 20165318 20165322 20165326 实验一 开发环境的熟悉
  4. P1067 多项式输出(模拟)
  5. 2016. 增量元素之间的最大差值
  6. SQL SERVER数据库的简单介绍
  7. 软件接口测试一个项目的实战,全网最全postman接口测试教程和接口项目实战~从入门到精通!!!...
  8. [NFrog]工具(NHibernate)终于成形了
  9. Java各种规则引擎
  10. 19. 卫健委官网医院查询爬虫+验证码识别(云打码)综合案例
  11. NYOJ 1016 德莱联盟(计算几何 线段相交判定)
  12. 【老生谈算法】matlab实现RSA算法源码——RSA算法
  13. Java必学的工具库,让你的代码量减少90%
  14. 糖友秦女士反映时刻注意自己的饮食太痛苦了
  15. 7.3 有源滤波电路(2)
  16. 基于leftlet的旅游地图相册
  17. GD32F407移植SR8201F
  18. 牛客寒假算法基础集训营6 I wzoi
  19. 微信中打开网页,链接无法跳转处理
  20. 国产数据库比较之大数据分析

热门文章

  1. 分布式事务之TX-LCN
  2. 机器学习服务助应用内文本语种在线和离线检测
  3. ZCU104开发板MIPI摄像头开发(详细介绍移植ZCU102example design)
  4. 后台管理系统——登录功能
  5. eclipse中文语言包安装(别看网上那些乱七八糟的,我这个最简单)
  6. 大数据核心技术是什么
  7. REDIS11_HyperLogLog的概述、基本命令、UV、PV、DAU、MAU、首页UV如何进行统计处理
  8. MaxEnt运行报错的各种问题及解决方法
  9. 用计算机算法拼拼图,算法 – “拼图拼图”拼图
  10. python中.mat的图像数据怎么转换为.npy的数据