【数据结构】【C++】堆栈的实现与应用
堆栈(Stack)
参考浙大版《数据结构(第2版)》
- 堆栈可以认为是具有一定约束的线性表,插入和删除的操作都在栈顶的位置,先进入的元素将在后进入的元素之后取出,与生活中的桶类似,故又称为后入先出(Last In First Out, LIFO)表。
非STL的堆栈实现:
- 手写的堆栈主要有以下几种基本操作:
- Stack CreateStack(int MaxSize):生成空堆栈,其最大长度为MaxSize;
- bool IsFull(Stack S):判断堆栈S是否已满。若S中的元素个数等于MaxSize则返回true,否则返回false;
- bool Push(Stack S, ElememtType X):将元素X压入堆栈。若堆栈已满,返回false;否则将元素X插入到堆栈S栈顶处并返回true;
- bool IsEmpty(Stack S):判断堆栈S是否为空,若是返回true;否则返回false;
- ElementType Pop(Stack S):删除并返回栈顶元素,若堆栈为空则返回错误信息;
堆栈的顺序储存实现
- 顺序栈类型定义如下(以整数为例):
typedef int ElementType;
typedef int Position;
typedef struct SNode * Stack;
struct SNode
{
ElementType * Date;
Position Top;
int MaxSize;
};
- 顺序栈以上操作的代码实现:
//生成空堆栈
Stack CreateStack(int MaxSize)
{
Stack S = (Stack)malloc(sizeof(struct SNode));
S ->Date = (ElementType *)malloc(MaxSize * sizeof(ElementType));
S ->Top = -1;
S ->MaxSize = MaxSize;
return S;
}
//判断堆栈是否已满
bool IsFull(Stack S)
{
return (S ->Top == S ->MaxSize);
}
//圧栈操作
bool Push(Stack S, ElementType x)
{
if(IsFull(S)) return 0;
else
{
S ->Date[++(S ->Top)] = x;
return 1;
}
}
//判断堆栈是否为空
bool IsEmpty(Stack S)
{
return (S ->Top == -1);
}
//弹出栈操作
ElementType Pop(Stack S)
{
if(IsEmpty(S)) return ERROR;
else
{
return (S ->Date[(S ->Top)--]);
}
}
堆栈的链式存储实现
- 堆栈的链式存储由链表实现,因此不存在堆栈大小的问题,故没有判断栈满的操作;
- 链式栈的类型声明:
typedef int ElementType;
typedef struct SNode * Stack;
struct SNode
{
ElementType Data;
Stack Next;
};
- 基本操作的代码实现:
//生成空堆栈
Stack CreateStack(Stack S)
{
S = (Stack)malloc(sizeof(struct SNode));
S ->Next =NULL;
return S;
}
//圧栈操作
void Push(Stack S, ElementType X)
{
Stack t = (Stack)malloc(sizeof(struct SNode));
t ->Data = X;
t ->Next = S ->Next;
S ->Next = t;
}
//判断栈是否为空
bool IsEmpty(Stack S)
{
return (S ->Next == NULL);
}
//弹出栈
ElementType Pop(Stack S)
{
if(IsEmpty(S))
{
return ERROR;
}
else
{
Stack TopElem = S ->Next;
int Top = TopElem ->Data;
S ->Next = TopElem ->Next;
free(TopElem);//注意要及时释放内存
return Top;
}
}
STL中的堆栈
在C++的STL中自带堆栈,一般情况下使用STL较多
- 头文件:
#include <stack>
- 基本操作:
- stacks; //生成空堆栈
- s.empty() //若堆栈为空则返回真,否则返回假
- s.pop() //移除栈顶元素
- s.push(item) //在栈顶增加元素item
- s.size() //返回栈中元素数目
- s.top() //返回栈顶元素
未完待续……
【数据结构】【C++】堆栈的实现与应用的更多相关文章
- python数据结构之堆栈
本篇我以堆栈的数据类型和操作方法两个方面总结学习笔记 堆栈(Stack) 一种后进先出(LIFO)的线性数据结构,对堆栈的插入和删除操作都只能在栈顶(top)进行. 堆栈可以通过数组和链表轻松实现 一 ...
- 数据结构之堆栈C++版
/* 堆栈本身就是一种线性数据结构,说白了他与容器线性表是一种数据类型,不要认为他多高大上. 实时上他还没有线性表复杂,下面简单的实现一下堆栈. 事实上整个核心操作都是在操作指向堆栈的顶部元素的指针 ...
- Python 数据结构_堆栈
目录 目录 堆栈 堆栈 堆栈是一个后进先出(LIFO)的数据结构. 堆栈这个数据结构可以用于处理大部分具有后进先出的特性的程序流 . 在堆栈中, push 和 pop 是常用术语: push: 意思是 ...
- NYOJ-2 括号配对问题 -- 数据结构_堆栈
以前做过的,现在整理一下,主要是堆栈的使用 1.碰到左括号就入栈,碰到右括号就从栈里弹出一个和当前比配,匹配失败就肯定是NO了; 2.如果右括号弹栈的时候栈空,则说明之前没有和右括号匹配的左括号了,这 ...
- 算法与数据结构基础 - 堆栈(Stack)
堆栈基础 堆栈(stack)具有“后进先出”的特性,利用这个特性我们可以用堆栈来解决这样一类问题:后续的输入会影响到前面的阶段性结果.线性地遍历输入并用stack处理,这类问题较简单,求解时间复杂度一 ...
- 数据结构之堆栈java版
import java.lang.reflect.Array; /* 具体原理在c++版已经说的很清楚,这里不再赘述, 就提一点:java的泛型具有边界效应,一旦离开作用域立马被替换为object类型 ...
- 使用LinkedList模拟一个堆栈或者队列数据结构
使用LinkedList模拟一个堆栈或者队列数据结构. 堆栈:先进后出 如同一个杯子. 队列:先进先出 如同一个水管. import java.util.LinkedList; public cl ...
- java集合 collection-list-LinkedList 模拟一个堆栈或者队列数据结构。
/* 使用LinkedList模拟一个堆栈或者队列数据结构. 堆栈:先进后出 如同一个杯子. 队列:先进先出 First in First out FIFO 如同一个水管. */ import jav ...
- Java LinkedList特有方法程序小解 && 使用LinkedList 模拟一个堆栈或者队列数据结构。
package Collection; import java.util.LinkedList; /* LinkedList:特有的方法 addFirst()/addLast(); getFirst( ...
- 面试题:使用LinkedList来模拟一个堆栈或者队列数据结构
请使用LinkedList来模拟一个堆栈或者队列数据结构. 堆栈:先进后出 First In Last Out (FILO) 队列:先进先出 First In First Out (FIFO) 我 ...
随机推荐
- 解决visual studio 2013编译过程中存在的无法打开kernel.lib问题
1. 出现此类问题的原因 由于原visual studio文件中的安装中出现问题,所以原有的SDK(soft development kits)文件出现缺失: 2. 解决方法1 重新下载SDK工具,安 ...
- 选择排序 C++实现
实现思想: 1.寻找[i, n)区间里的最小值min ( i>= 0 ) 2.交换min和第i的数 ( i>= 0 ) #include <iostream> #include ...
- ORACLE10G非归档模式下RMAN异机迁库
环境信息: 源库 目标库 操作系统 WIN7 WIN SVR 2012 R2 IP x.x.x.216 x.x.x.112 数据库版本 10.2.0.4.0 - 64bi 10.2.0.4.0 - 6 ...
- Windows配置winpcap
参考: https://blog.csdn.net/qq_29350467/article/details/46663953?depth_1-utm_source=distribute.pc_rele ...
- Docke-ce 安装
Docker-ce 的安装 安装系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2 添加docker镜像源 yum-con ...
- CF1093E Intersection of Permutations [分块 +bitset]
大家好, 我非常喜欢暴力数据结构, 于是就用分块A了此题 分块题,考虑前缀和 \(b_i\) 表示 bitset 即 \(0\) ~ $i $ 出现过的数字,然后考虑直接暴力复制块然后前缀和,修改也很 ...
- gulp常用插件之yargs使用
更多gulp常用插件使用请访问:gulp常用插件汇总 yargs这是一款通过解析参数并生成优雅的用户界面来帮助您构建交互式命令行工具.处理命令行参数的通用解决方案,只要一句代码 var args = ...
- 数据结构与算法之比较排序【Java】
比较排序与非比较排序的对比 常见的快速排序.归并排序.堆排序.冒泡排序等属于比较排序.在排序的最终结果里,元素之间的次序依赖于它们之间的比较.每个数都必须和其他数进行比较,才能确定自己的位置.在冒泡排 ...
- F.Three pahs on a tree
思路 两次bfs找出树的直径并处理出端点离树上各叶子节点的距离,在直径上找一点的子树叶子p3,使得dis(p1,p2) + dis(p2,p3) + dis(p1,p3)最大 易知上式是路径实长的两倍 ...
- 题解 AT1812 【テレビ】
题目大意 高桥君有一个宽\(w\),高\(h\)的电视机. 判定\(w:h\)是\(4:3\)还是\(16:9\). 分析 我们可以理解成把一个比\(w:h\)化为最简整数比,也就是将\(w:h\)化 ...