第14课-栈的定义及实现

1. 栈的定义

(1)      栈是一种特殊的线性表。

(2)      栈仅能在线性表的一端进行操作。

l  栈顶(Top):允许操作的一端。

l  栈底(Bottom):不允许操作的一端。

2. 栈的性质--后进先出

3. 栈的操作

(1)      创建栈。

(2)      销毁栈。

(3)      清空栈。

(4)      进栈。

(5)      出栈。

(6)      获取栈顶元素。

(7)      获取栈的大小。

例子:

将上一节的文件SeqList.h和SeqList.c,加到我们建立的工程文件夹之中。然后建立下面的三个文件。

(1)SeqStack.h

#ifndef _SEQSTACK_H_

#define _SEQSTACK_H_

typedef void SeqStack;

SeqStack* SeqStack_Create(int capacity);

void SeqStack_Destroy(SeqStack* stack);

void SeqStack_Clear(SeqStack* stack);

int SeqStack_Push(SeqStack* stack, void* iteam);

void* SeqStack_Pop(SeqStack* stack);

void* SeqStack_Top(SeqStack* stack);

int SeqStack_Size(SeqStack* stack);

int SeqStack_Capacity(SeqStack* stack);

#endif

(2)SeqStack.c

#include"SeqStack.h"

#include"SeqList.h"

SeqStack* SeqStack_Create(int capacity)

{

return SeqList_Create(capacity);

}

void SeqStack_Destroy(SeqStack* stack)

{

SeqList_Destroy(stack);

}

void SeqStack_Clear(SeqStack* stack)

{

SeqList_Clear(stack);

}

int SeqStack_Push(SeqStack* stack, void* item)

{

return SeqList_Insert(stack,item,SeqList_Length(stack));

}

void* SeqStack_Pop(SeqStack* stack)

{

return SeqList_Delete(stack,SeqList_Length(stack) - 1);

}

void* SeqStack_Top(SeqStack* stack)

{

return SeqList_Get(stack,SeqList_Length(stack) - 1);

}

int SeqStack_Size(SeqStack* stack)

{

return SeqList_Length(stack);

}

int SeqStack_Capacity(SeqStack* stack)

{

return SeqList_Capacity(stack);

}

(3)main.c

#include <stdio.h>

#include <stdlib.h>

#include "SeqStack.h"

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[])

{

SeqStack* stack = SeqStack_Create(20);

int a[10];

int i = 0;

for(i=0; i<10; i++)

{

a[i] = i;

SeqStack_Push(stack, a + i);

}

printf("Top: %d\n", *(int*)SeqStack_Top(stack));

printf("Capacity: %d\n", SeqStack_Capacity(stack));

printf("Length: %d\n", SeqStack_Size(stack));

while( SeqStack_Size(stack) > 0 )

{

printf("Pop: %d\n", *(int*)SeqStack_Pop(stack));

}

SeqStack_Destroy(stack);

return 0;

}

4. 栈的顺序存储实现

5. 栈的链式存储实现

将上节课的LinkList.h和LinkList.c复制到我们这节课用的文件夹之中。然后建立下面的三个文件。

(1)LinkStack.h

#ifndef _LINKSTACK_H_

#define _LINKSTACK_H_

typedef void LinkStack;

LinkStack* LinkStack_Create();

void LinkStack_Destroy(LinkStack* stack);

void LinkStack_Clear(LinkStack* stack);

int LinkStack_Push(LinkStack* stack, void* item);

void* LinkStack_Pop(LinkStack* stack);

void* LinkStack_Top(LinkStack* stack);

int LinkStack_Size(LinkStack* stack);

#endif

(2)LinkStack.c

#include <malloc.h>

#include "LinkStack.h"

#include "LinkList.h"

typedef struct _tag_LinkStackNode

{

LinkListNode header;

void* item;

} TLinkStackNode;

LinkStack* LinkStack_Create()

{

return LinkList_Create();

}

void LinkStack_Destroy(LinkStack* stack)

{

LinkStack_Clear(stack);

LinkList_Destroy(stack);

}

void LinkStack_Clear(LinkStack* stack)

{

while( LinkStack_Size(stack) > 0 )

{

LinkStack_Pop(stack);

}

}

int LinkStack_Push(LinkStack* stack, void* item)

{

TLinkStackNode* node = (TLinkStackNode*)malloc(sizeof(TLinkStackNode));

int ret = (node != NULL) && (item != NULL);

if( ret )

{

node->item = item;

ret  = LinkList_Insert(stack, (LinkListNode*)node, 0);

}

if( !ret )

{

free(node);

}

return ret;

}

void* LinkStack_Pop(LinkStack* stack)

{

TLinkStackNode* node = (TLinkStackNode*)LinkList_Delete(stack, 0);

void* ret = NULL;

if( node != NULL )

{

ret = node->item;

free(node);

}

return ret;

}

void* LinkStack_Top(LinkStack* stack)

{

TLinkStackNode* node = (TLinkStackNode*)LinkList_Get(stack, 0);

void* ret = NULL;

if( node != NULL )

{

ret = node->item;

}

return ret;

}

int LinkStack_Size(LinkStack* stack)

{

return LinkList_Length(stack);

}

(3)main.c

#include <stdio.h>

#include <stdlib.h>

#include "LinkStack.h"

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[])

{

LinkStack* stack = LinkStack_Create();

int a[10];

int i = 0;

for(i=0; i<10; i++)

{

a[i] = i;

LinkStack_Push(stack, a + i);

}

printf("Top: %d\n", *(int*)LinkStack_Top(stack));

printf("Length: %d\n", LinkStack_Size(stack));

while( LinkStack_Size(stack) > 0 )

{

printf("Pop: %d\n", *(int*)LinkStack_Pop(stack));

}

LinkStack_Destroy(stack);

return 0;

}

小结

l  栈是一种特殊的线性表。

l  栈只允许在线性表的一端进行操作。

l  栈通常有两种实现方式:顺序结构实现,链式结。

转载于:https://www.cnblogs.com/free-1122/p/11322769.html

数据-第14课-栈的定义及实现相关推荐

  1. 计算机网络协议分析 第14课 SCTP

    计算机网络协议分析 第14课 SCTP 第8章 流控制传输协议SCTP SCTP的上层应用 8.1 SCTP的特点 多宿主 多重流 初始化保护 8.2 SCTP分组格式 SCTP分组与TCP报文段的区 ...

  2. 在java的实现栈的插入数据_Java实现数据结构栈stack和队列Queue

    回顾JDK提供的集合类 容器(集合)框架如下: 集合类存放于java.util包中.集合类存放的都是对象的引用,而非对象本身. 集合类型主要有3种:set(集).list(列表)和map(映射). C ...

  3. window.addeventlistener 不能调用方法_Java入门第十四课:如何定义”方法“

    第十四课,学习定义方法.一个对象包含三种最常见的成员:构造器.Field和方法.Field用于定义状态数据,而方法是行为特征的抽象. 那么什么是方法呢? 在Java中,方法就是用来完成解决某件事情或实 ...

  4. 链栈的定义、构建、入栈、出栈和取栈顶元素

    一.链栈的定义: #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 typedef int S ...

  5. 太空射击第14课: 玩家生命

    太空射击第14课: 玩家生命 在本课中,我们将为玩家添加多个生命值,并在玩家死亡时添加一个漂亮的爆炸. 本教程所有素材包从这里下载 视频 您可以在此处观看本课程的视频: 玩家爆炸 我们将使用不同的爆炸 ...

  6. 数据泄漏防御DLP的确切定义

    数据泄漏防御DLP的确切定义 数据安全中的数据泄漏防御(DLP)是个常被误解的术语.由于这个领域有着很多的需求,很多公司自夸自己拥有DLP功能,其实它们根本就和DLP扯不上边.分析师也常被搞糊涂了.我 ...

  7. 【鱼C·零基础入门学习Python】课后习题答案 第14课

    鉴于半导体制造业进入了瓶颈,处于找不到工作的深深忧虑,故最近开始学习Python.发现鱼C工作室的<零基础入门学习python>教程很不错,视频讲解生动,最主要的是他的课后练习很不错.以下 ...

  8. 三维数字沙盘电子沙盘人工智能地理信息系统开发教程第14课

    三维数字沙盘电子沙盘人工智能地理信息系统开发教程第14课 很久没有写了,主要前段时间在针对怎么显示高精度的 倾斜数据而努力,现在终于实现了效果不错.以前的版本显示倾斜数据控制不太好.最近SDK也改动了 ...

  9. Qz学算法-数据结构篇(链表、栈)

    链表(Linked List) 链表是有序的列表,但是它在内存中是存储如下 介绍 链表是以节点的方式来存储,是链式存储 每个节点包含data域,next域:指向下一个节点. 如图:发现链表的各个节点不 ...

  10. Spark3000门徒第14课spark RDD解密总结

    今晚听了王家林老师的第14课spark RDD解密,课堂笔记如下: Spark是基于工作集的应用抽象,RDD:Resillient Distributed Dataset是基于工作集的,spark可以 ...

最新文章

  1. 一行CSS样式去除百度地图版权,去除百度地图右上角平移缩放控件的市县区文字
  2. 准确率precison与正确率accuracy区别
  3. 大家都说 Java 反射效率低,为什么呢?
  4. python numpy数组和one-hot编码相互转换
  5. 源哥每日一题第十七弹 poj 1568 Alpha-Beta剪枝
  6. 两个排序数组的中位数
  7. 面试第二弹-重点描述
  8. 打造微信“智慧城市” 乌海率先开通城市公共微信服务
  9. c语言笔试题 选择题,C语言笔试选择题
  10. Class 学习 (Es6阮一峰)
  11. 关于触发器原理及选型参数
  12. python猜拳小游戏_Python入门猜拳小游戏
  13. vivado ILA核使用教程
  14. Python实现的无法拒绝的情人节表白代码,python情人节表白代码
  15. SQL中十六进制和字符串之间的转换
  16. 超文本标记语言--Html
  17. Tomcat是干嘛用的?企业级Tomcat部署实践及安全调优
  18. 针对网络层的DoS攻击
  19. 一个有用的数据库:中国研究数据服务平台(CNRDS)
  20. c 语言单片机开发,单片机C语言开发离不开它

热门文章

  1. 分布式系统面试题:分布式事务解决方案?
  2. SSM框架02--mybatis(1)
  3. 深度系统优化工具_HiBit Uninstaller卸载工具【win版】
  4. 认认真真推荐10个牛逼公号!
  5. 计算机应用基础演讲怎么开口,计算机应用基础讲课稿
  6. php增加会员功能_在帝国CMS后台增加手动添加会员功能
  7. jdbc连接oracle mysql_JDBC连接MySQL、Oracle和SQL server的配置
  8. android 自定义tabhost,安卓选项卡的实现方法(TabActivity),自定义TabHost容器
  9. 2017年10月份计算机网络管理,2017年下半年网络管理员考试上午试题及答案
  10. android 原型模式,原型模式-下拉刷新的全局设置