【数据结构】【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) 我 ...
随机推荐
- Java Web Servlet知识点讲解(二)
一.定义Servlet: public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpSer ...
- java 企业 网站源码 模版 屏幕自适应 有前后台 springmvc SSM 生成静态化
前台: 支持四套模版, 可以在后台切换 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成html 2.因为是生成的html,所以访问 ...
- mysql 不能加载表问题
记录一次 mysql 5.7 下,出现重启数据库后不能加载特定表的问题处理. 搜索了很多的类似的错误,大多都是说因为外键同名的索引丢失的情况.但在5.7这个版本下,会禁止更新外键关联的索引. 最后经过 ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(2)
Linux 系统定制原理 虚拟根目录 我们的目标是为了完成目标系统(也就是我们要做的系统),他是一个可以独立运行的系统,不依赖雨主系统和临时系统,根据 Linux 系统的特点它需要存放在根目录下面,但 ...
- Android8.0自定义广播接收不到问题
https://blog.csdn.net/kongqwesd12/article/details/78998151
- 牛客练习赛56 B 小琛和他的学校
题目链接:https://ac.nowcoder.com/acm/contest/3566/B 思路:一条路可把图分为左右两部分. l_ci, l_peo, r_ci, r_peo, w 分别为左边城 ...
- Spring中 @Autowired注解与J2EE@Resource注解的区别
在开发中经常使用到@Autowired和@Resource进行装配. 不禁好奇这两个注解的差异在何处??? 相同点: @Resource的作用相当于@Autowired,均可标注在字段或属性的sett ...
- git签名设置
作用:只区分不同开发人员的身份 一.项目级别/仓库级别:仅在当前本地库范围内有效 签名设置用户名(UserName)和邮箱(User@email),邮箱可以是任意邮箱(无效邮箱也可以) git con ...
- 抛弃VMware吧,使用Win10自带的Hyper-V创建虚拟机
个人博客 地址:https://www.wenhaofan.com/article/20190619221449 介绍 Hyper-V是微软提出的一种系统管理程序虚拟化技术,能够实现桌面虚拟化. 启动 ...
- C# WPF 时钟动画(1/2)
微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. C# WPF 时钟动画(1/2) 内容目录 实现效果 业务场景 编码实现 本文参考 源码下载 ...