创建: 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下做的比较多,大体的思路都是先根据用户提供的用户名和密码到数据库找到用户信息,然后校验,校验成功之后记住用户的姓名和相关信息,这个信息 ...
随机推荐
- 安装 asp.net core 出错
I received the same error message on a fresh Windows 10 install, with a fresh Visual Studio 2015 ins ...
- 我们参与投资36Kr股权众筹项目“易途8”的决策过程
背景 中文接机.中文送机.中文包车. 当地玩乐 最大的竞争对手:皇包车,15年9月A轮 其它对手:唐人接等,订单量无法和 皇包车.易途8比. 看好理由 1.旅游行业和境外自由行,是 ...
- 九度oj 题目1077:最大序列和
题目1077:最大序列和 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6435 解决:1931 题目描述: 给出一个整数序列S,其中有N个数,定义其中一个非空连续子序列T中所有数的和为T ...
- 关于android系统启动不同activity默认过渡动画不同的一些认识
在同一个android设备里,发现不同的app启动时显示的过渡动画是不同的.查看显示不同过渡动画的两个app的源码,其设置的主题都是同一个主题,但是为什么过渡动画效果不同呢?后来发现,activity ...
- codevs 3971 航班
题目描述 Description B 国有N 座城市,其中1 号是这座国家的首都. N 座城市之间有M 趟双向航班.i 号点的转机次数定义为:从1 号点到i ,最少需要转机几 次.如果1 根本无法到达 ...
- Linux下汇编语言学习笔记47 ---
这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...
- Thinkphp5.0 的视图view的循环标签
Thinkphp5.0 的视图view的循环标签 volist标签: <!-- 使用volist --> <!-- name是传递过来的要循环变量名 --> <!-- k ...
- jQuery源代码解析(1)—— jq基础、data缓存系统
闲话 jquery 的源代码已经到了1.12.0版本号.据官网说1版本号和2版本号若无意外将不再更新,3版本号将做一个架构上大的调整.但预计能兼容IE6-8的.或许这已经是最后的样子了. 我学习jq的 ...
- [Algorithms] Determine if a string is a palindrome
A palindrome is a string that reads the same forward and backward, for example, radar, toot, and mad ...
- 异 形 卵 709 南阳oj
http://acm.nyist.net/JudgeOnline/problem.php? pid=709 异 形 卵 时间限制:1000 ms | 内存限制:65535 KB 难度: 描写叙述 ...