创建: 2018/01/15
更新: 2018/01/24 更改标题 [【WIP_S3】堆] => [【WIP_S4】堆]
继续添加内容
更新: 2018/05/13 更改标题 [【WIP_S4】堆] => [【WIP_S4】栈]
所有[堆]替换成[栈]
栈 |
特点 |
一种数据结构
后入后处(LIFO)
放入: push
取出(最后一个): pop
|
什么时候用栈 |
后入后厨,就是新来的事务更重要,要先处理的情况 |
栈的ADT |
主要的栈运算 |
● push(int data) :插入栈
|
● int pop() :获取最后的元素并从栈删除 |
辅助的栈运算 |
● int top() : 不取出,只是获取最后的元素
|
● int size() : 获取栈内元素个数
|
● int isEmptyStatck() :是否为空
|
● int isFullStatck() : 是否已满 |
例外 |
pop空栈
push满栈
|
|
|
|
应用 |
● 记号的平衡?# TODO: check [p82意思]
● 中置式变换为后置式 # TODO: check [p82意思]
● (包含递归的)函数呼出的实现
● 跨度运算 # TODO: check [p82意思]
● 浏览器的访问历史(返回按钮)
● 文本编辑器的返回功能
● HTML和XML的标签匹配吧
|
实现1
纯数组实现
|
- //------------------------------------------------
- // 型声明
- //------------------------------------------------
- #define PRO_STACK_SIZE_V1 100
- struct arrayStack {
- int top; //开头的索引
- int capacity; // 容量
- int *array;
- };
- //------------------------------------------------
- // 函数声明
- //------------------------------------------------
- struct arrayStack *createStack(void);// 创建栈
- int isEmptyStack(struct arrayStack *s); // 判断是否为空
- int isFullStack(struct arrayStack *s);// 判断是否已满
- void push(struct arrayStack *s, int data); // push
- int pop(struct arrayStack *s); //pop
- void deleteStack(struct arrayStack *s); // 删除栈
- //------------------------------------------------
- //
- //
- //------------------------------------------------
- struct arrayStack *createStack() { // 创建栈
- struct arrayStack *s = (struct arrayStack *)malloc(sizeof(struct arrayStack));
- if (s == NULL) {
- puts("单纯数组版,栈初始化失败");
- return NULL;
- }
- s->capacity = PRO_STACK_SIZE_V1;
- s->top = -;
- s->array = malloc(s->capacity * sizeof(int));
- if (s->array == NULL) {
- puts("单纯数组版, 栈数据初始化失败");
- return NULL;
- }
- return s;
- }
-
- int isEmptyStack(struct arrayStack *s) { // 判断是否为空
- return (s->top == -); // 条件成立返回1(真), 不成立返回0(否)
- }
-
- int isFullStack(struct arrayStack *s) { // 判断是否已满
- return (s->top >= (s->capacity -));
- }
-
- void push(struct arrayStack *s, int data) { // push
- if (isFullStack(s)) {
- puts("栈已满");
- return;
- } else {
- s->array[++s->top] = data; //插入到最后一个的后面
- }
- }
-
- int pop(struct arrayStack *s) { //pop
- if (isEmptyStack(s)) {
- puts("栈为空");
- return ;
- }else {
- return s->array[s->top--]; // 返回最后一个并把top-1
- }
- }
-
- void deleteStack(struct arrayStack *s) { // 删除栈
- if (s) {
- if (s->array) {
- free(s->array);
- }
- free(s);
- }
- }
|
实现2
动态数组实现
|
数组满了就换一个两倍长度的
- //------------------------------------------------
- // 型声明
- //------------------------------------------------
- #define PRO_STACK_SIZE_V2 100
- struct dynArrayStack {
- int top;
- int capacity;
- int *array;
- };
- //------------------------------------------------
- // 函数声明
- //------------------------------------------------
- struct dynArrayStack *createStackDyn(void);// 创建栈
- int isEmptyStackDyn(struct dynArrayStack *s); // 判断是否为空
- int isFullStackDyn(struct dynArrayStack *s);// 判断是否已满
- void doubleStackDyn(struct dynArrayStack *s); // 双倍栈数据容量
- void pushDyn(struct dynArrayStack *s, int data); // push
- int topDyn(struct dynArrayStack *s); // 查看最后一个元素
- int popDyn(struct dynArrayStack *s); //pop
- void deleteStackDyn(struct dynArrayStack *s); // 删除栈
- //------------------------------------------------
- // 函数实现
- //------------------------------------------------
- struct dynArrayStack *createStackDyn(void) { // 创建栈
- struct dynArrayStack *s = (struct dynArrayStack *)malloc(sizeof(struct dynArrayStack));
- if (s == NULL) {
- puts("动态数组版, 初始化失败");
- return NULL;
- }
- s->capacity = PRO_STACK_SIZE_V2;
- s->top = -;
- s->array = (int *)malloc(s->capacity * sizeof(int));
- if (s->array == NULL) {
- puts("动态数组版,栈数据初始化失败");
- return NULL;
- }
- return s;
- }
- int isEmptyStackDyn(struct dynArrayStack *s) { // 判断是否为空
- return s->top == -;
- }
- int isFullStackDyn(struct dynArrayStack *s) { // 判断是否已满
- return (s->top == s->capacity-);
- }
- void doubleStackDyn(struct dynArrayStack *s) { // 双倍栈数据容量
- s->capacity = s->capacity*;
- s->array = realloc(s->array, s->capacity);
- if (s->array == NULL) {
- puts("动态数组版,加长栈容量失败");
- return;
- }
- }
- void pushDyn(struct dynArrayStack *s, int data) { // push
- if (isFullStackDyn(s)) {
- doubleStackDyn(s);
- }
- s->array[++s->top] = data;
- }
-
- int topDyn(struct dynArrayStack *s) { // 查看最后一个元素
- if (isEmptyStackDyn(s)) {
- return INT_MIN; // 在limits.h里
- }
- return s->array[s->top];
- }
- int popDyn(struct dynArrayStack *s) { // pop
- if (isEmptyStackDyn(s)) {
- return INT_MIN;
- }
- return s->array[s->top--];
- }
- void deleteStackDyn(struct dynArrayStack *s) { // 删除栈
- if (s) {
- if (s->array) {
- free(s->array);
- }
- free(s);
- }
- }
|
实现3
链表实现
|
- //------------------------------------------------
- // 型声明
- //------------------------------------------------
- struct listNodeStack {
- int data;
- struct listNodeStack *next;
- };
- //------------------------------------------------
- // 函数声明
- //------------------------------------------------
- //struct listNodeStack *createStackList(void);// 不用创建
- int isEmptyStackList(struct listNodeStack *s); // 判断是否为空
- //int isFullStackList(struct listNodeStack *s);// 永不满
- void pushList(struct listNodeStack **s, int data); // push
- int topList(struct listNodeStack *s); // top 查看最后一个元素
- int popList(struct listNodeStack **s); //pop
- void deleteStackList(struct listNodeStack **s); // 删除栈
- //------------------------------------------------
- // 函数实现
- //------------------------------------------------
- int isEmptyStackList(struct listNodeStack *s) { // 判断是否为空
- return s == NULL;
- }
- void pushList(struct listNodeStack **s, int data) { // push
- struct listNodeStack *temp;
- temp = (struct listNodeStack *)malloc(sizeof(struct listNodeStack));
- if (temp == NULL) {
- puts("链表版, push, 生成新节点失败");
- return;
- }
- temp->data = data;
- temp->next = *s;
- *s = temp;
- }
- int topList(struct listNodeStack *s) { // top 查看最后一个元素
- if (isEmptyStackList(s)) {
- return INT_MIN;
- }
- return s->data;
- }
- int popList(struct listNodeStack **s) { //pop
- struct listNodeStack *temp;
- int data;
- if (isEmptyStackList(*s)) {
- return INT_MIN;
- }
- temp = *s;
- *s = temp->next;
- data = temp->data;
- free(temp);
- return data;
-
- }
- void deleteStackList(struct listNodeStack **s) { // 删除栈
- struct listNodeStack *current, *temp;
- current = *s;
- while (current) {
- temp = current;
- current = current->next;
- free(temp);
- }
- *s = NULL;
- }
|
|
|
- 通往全栈工程师的捷径 —— react
腾讯Bugly特约作者: 左明 首先,我们来看看 React 在世界范围的热度趋势,下图是关键词“房价”和 “React” 在 Google Trends 上的搜索量对比,蓝色的是 React,红色的 ...
- Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)
--reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...
- duang~免费的学习视频来啦:学霸君之全栈测试
学霸君向童鞋们推荐一款 同名学霸学习 视频教程 重点是完全免费收看学习噢!!! 今天 学霸君推荐腾讯课堂的学霸君之全栈测试 复制下方链接至腾讯课堂中报名学习 https://ke.qq.com/cou ...
- [数据结构]——链表(list)、队列(queue)和栈(stack)
在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...
- BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 8748 Solved: 3835[Submi ...
- BZOJ 4453: cys就是要拿英魂![后缀数组 ST表 单调栈类似物]
4453: cys就是要拿英魂! Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 90 Solved: 46[Submit][Status][Discu ...
- BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2326 Solved: 1054[Submit][Status ...
- .NET全栈开发工程师学习路径
PS:最近一直反复地看博客园以前发布的一条.NET全栈开发工程师的招聘启事,觉得这是我看过最有创意也最朴实的一个招聘启事,更为重要的是它更像是一个技术提纲,能够指引我们的学习和提升,现在转载过来与各位 ...
- Nodejs之MEAN栈开发(八)---- 用户认证与会话管理详解
用户认证与会话管理基本上是每个网站必备的一个功能.在Asp.net下做的比较多,大体的思路都是先根据用户提供的用户名和密码到数据库找到用户信息,然后校验,校验成功之后记住用户的姓名和相关信息,这个信息 ...
随机推荐
- HTML、CSS常用技巧
一.HTML 在介绍HTML之前,我们先看一下HTML的文档树结构,主要包括哪些: (一).头部标签 1,Doctype Doctype告诉浏览器使用什么样的HTML或XHTML规范来解析HTML文档 ...
- layer弹层content写错导致div复制了一次,导致id失效 $().val() 获取不到dispaly:none div里表单的值
错误之源: $("a.consult").click(function () { lib_consult_html = $('#consult-html').h ...
- ASP.NET获取客户端IP及MAC地址
朋友最近问如何获取客户端IP及MAC地址,一直想把这段给整理一下,契机来了:下边分为了C#后台获取的方法和前台Javascript(调用ActiveX)获取的方法,大家如果有好的方法一起讨论撒O(∩_ ...
- Floyd算法实现总结
问题描述 给出图,求任意两点的最短距离 算法思路 定义n+1个矩阵矩阵A,和记录路径的矩阵path 依次求A0~An的值,最后的An即为最短路径矩阵 // int A[8][7][7],path[7] ...
- [codeforces500E]New Year Domino
[codeforces500E]New Year Domino 试题描述 Celebrating the new year, many people post videos of falling do ...
- 【ZJOI2018 Round2游记】
在主场作为高三退役选手要去听一些奇怪的宣讲 看看有没有PY的机会 语文考试考到一半溜出来 ZJU先上 开始挑衅 很勇啊 THU的校友 然而这些都离我太过遥远 最后PY了一波 获得了鼓励(并不) 最后的 ...
- 【Eclipse】eclipse安装JAVA反编译插件
前言:在实际的开发中几乎都会使用到一些框架来辅助项目的开发工作,对于一些框架的代码我们总怀有一些好奇之心,想一探究竟,有源码当然更好了,对于有些JAR包中的代码我们就需要利用反编译工具来看一下了,下面 ...
- Eclipse使用Maven时,修改默认中央仓库后的配置报错找不到包的问题解决
一般在公司内容配置Maven时会在settings.xml文件下配置私服nexus地址,那么修改完之后在Eclipse中如果不指定用户目录级别的settings.xml文件会出现找不到包的问题. se ...
- mybatis resultmap标签type属性什么意思
mybatis resultmap标签type属性什么意思? :就表示被转换的对象啊,被转换成object的类型啊 <resultMap id="BaseResultMap" ...
- 移动端 js 实现图片上传 预览
方法一: <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv=&q ...