1 栈的定义

栈是限定在表尾进行插入和删除操作的线性表。

2 栈的特点

1)栈是特殊的线性表,线性表也具有前驱后继性;

2)栈的插入和删除操作只能在表尾即栈顶进行;

3)后进先出。

3 栈的实现及关键点

3.1 顺序栈

3.1.1 关键点

1)顺序栈用数组实现,可以将栈底和索引为0的数组空间对齐以降低插入删除操作的空间复杂度;

2)保持栈顶指针top和数组索引一致可降低操作复杂度,空栈的条件是-1 == top,满栈的条件为 栈长-1 == top。

3.1.2 实现

 #ifndef SQUENCESTACK_H
#define SQUENCESTACK_H typedef int ElemType; class SquenceStack
{
private:
ElemType* m_pData;
int m_stackSize; //栈长
int m_top; //栈顶指针 public:
SquenceStack(int stackSize);
~SquenceStack();
void ClearStack() { m_top = -; } //清空栈
bool Push(ElemType elem); //压栈
bool Pop(ElemType* pElem); //弹栈
bool VisitStack() const; //顺序遍历栈
bool EmptyStack() const { return - == m_top; } //判断是否为空栈
}; #endif
 #include "pch.h"
#include "SquenceStack.h"
#include <iostream> SquenceStack::SquenceStack(int stackSize)
{
m_stackSize = stackSize;
m_top = -;
m_pData = new ElemType[stackSize];
} SquenceStack::~SquenceStack()
{
delete[] m_pData;
} bool SquenceStack::Push(ElemType elem) //压栈
{
if (m_stackSize - == m_top) //满栈
return false; ++m_top;
m_pData[m_top] = elem; return true;
} bool SquenceStack::Pop(ElemType* pElem) //弹栈
{
if (EmptyStack()) //空栈
return false; *pElem = m_pData[m_top];
--m_top; return true;
} bool SquenceStack::VisitStack() const //顺序遍历栈
{
if (EmptyStack())
{
std::cout << "The stack is Empty." << std::endl;
return false;
} std::cout << "the element of stack: ";
for (int i = ; i <= m_top; ++i)
std::cout << m_pData[i] << ' ';
std::cout << std::endl; return true;
}

测试代码:

 #include "pch.h"
#include "SquenceStack.h"
#include <iostream> using namespace std; int main()
{
SquenceStack stack();
stack.VisitStack();
stack.Push();
stack.Push();
stack.Push();
stack.Push();
stack.Push();
stack.VisitStack();
ElemType elem;
stack.Pop(&elem);
stack.Pop(&elem);
stack.VisitStack(); return ;
}

测试结果:

3.2 两栈共享空间

3.2.1 适用条件

当两个栈的空间需求有相反关系时,也就是一个栈增长的同时另一个栈在缩短。(增长收缩的快慢应该相同)

3.2.2 实现与关键点

用一个数组来存储两个栈。数组有两个端点,两个栈有两个栈底,让一个栈的栈底为数组的始端,即下标0处;另一个栈的栈底为数组的末端,即下标为数组长度n-1处。

那么栈1为空时,top1等于-1;栈2为空时,top2等于n;栈满的条件为top1 + 1 == top2。

3.3 链栈

3.3.1 关键点

1)单链表的头指针是必须的,而栈的栈顶指针也是必须的,自然的,可以将头指针和栈顶指针合二为一;

2)链栈为空的条件为nullptr == top,由于只在栈顶进行操作,所以在链表中为了统一操作的哨兵结点失去了作用。

3.3.2 实现

略。

4 栈的应用场景

4.1 四则运算表达式

规则:通过两个栈来实现,其中一个保存操作数的栈,另一个保存运算符的栈。当我们从左到右遍历表达式,当遇到数字,我们就直接压如操作数栈;当遇到运算符,就与运算符栈的栈顶元素进行比较。如果比运算符栈顶元素的优先级高,就将当前运算符压入栈;如果比运算符栈顶元素的优先级低或者相同,从运算符栈中取栈顶运算符,从操作数栈的栈顶取2个操作数,然后计算,再把计算完的结果压入操作数栈,继续比较;其中左括号直接进栈,遇到右括号时运算到匹配到左括号为止。

该篇博客是自己的学习博客,水平有限,如果有哪里理解不对的地方,希望大家可以指正!

栈(LIFO)的更多相关文章

  1. 数据结构复习笔记(ADT栈/LIFO表)

    栈是一种特殊的表,只在表首进行插入和删除操作,表首称之为栈顶,表尾称为栈底:栈的核心原则是先进后出,简称Last In First Out(LIFO表):常用的运算有:1.是否为空栈判断:2.栈是否满 ...

  2. .NET全栈开发工程师学习路径

    PS:最近一直反复地看博客园以前发布的一条.NET全栈开发工程师的招聘启事,觉得这是我看过最有创意也最朴实的一个招聘启事,更为重要的是它更像是一个技术提纲,能够指引我们的学习和提升,现在转载过来与各位 ...

  3. 纸上谈兵:栈(stack)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 栈(stack)是简单的数据结构,但在计算机中使用广泛.它是有序的元素集合.栈最显 ...

  4. Python旅途——函数的递归和栈的使用

    Python--函数之递归.栈的使用 今天主要和大家分享函数的递归,同时引入一个新的概念--栈 1.递归 1.定义 函数的递归指的就是函数自己调用自己,什么是函数自己调用自己呢?我们来看一个栗子: 这 ...

  5. OI总结(垃圾排版就忽略了吧)

    学OI一年了,到现在联赛所需要的知识已经基本学完了.现在,有必要回过头来,总结总结自己一年来学到的知识以及得到的经验教训. 基础 语言基础 C++的语言基础啥的就略了吧. 算法复杂度分析 O:复杂度的 ...

  6. java集合类(六)About Queue

    接上篇“java集合类(五)About Map” 终于来到了java集合类的尾声,太兴奋了,不是因为可以休息一阵了,而是因为又到了开启新知识的时刻,大家一起加油打气!!Come on...Fighti ...

  7. 《C# 并发编程 · 经典实例》读书笔记

    前言 最近在看<C# 并发编程 · 经典实例>这本书,这不是一本理论书,反而这是一本主要讲述怎么样更好的使用好目前 C#.NET 为我们提供的这些 API 的一本书,书中绝大部分是一些实例 ...

  8. JavaScript学习笔记之 数组方法一 堆栈 和队列

    数组的方法 以及 堆栈的操作的方法 JavaScript是一种弱类型语言,不像其它程序语言需要严格定义数据类型.在JavaScript中数组可以任意修改变动,这样也就出现了一个问题,如果边遍历数组边操 ...

  9. Gengxin讲STL系列——Queue和Stack

    第三篇. 感觉队列和栈是必须的……所以决定加上这两个…… 我发现我已经买域名买上隐了……今天又买了个.top……真是智障…… Queue(队列FIFO)和Statk(栈LIFO). 那么为什么要这两个 ...

  10. javascript高级程序设计一(1-80)

    源代码研究,实例:http://fgm.cc/learn/ js面试知识点: 1:原生.闭包.上下文.call.apply.prototype. 2:jsonp:用script标签实现跨域.xss:j ...

随机推荐

  1. C# Redis 过期机制不生效问题

    引用: https://ask.csdn.net/questions/358802 根据这里的代码写出监听事件后,事件并没有生效 在比对了多次配置文件后,终于发现了一点蹊跷,在配置中不能有与之相冲的配 ...

  2. 【.Net Core】处理静态文件

    静态文件存储在项目的 Web 根目录中. 默认目录是 <content_root>/wwwroot,但可通过 UseWebRoot 方法更改目录. public class Program ...

  3. MySQL优化COUNT()查询

    COUNT()聚合函数,以及如何优化使用了该函数的查询,很可能是最容易被人们误解的知识点之一 COUNT()的作用 COUNT()是一个特殊的函数,有两种非常不同的作用: 统计某个列值的数量 统计行数 ...

  4. Spring框架基础(上)

    spring是开源对轻量级框架 spring核心主要两部分 aop 面向切面编程,扩展功能不是修改源代码实现 aop采用横向抽取机制,取代了传统纵向继承体系重复代码(性能监视.事务管理.安全检查.缓存 ...

  5. 开源负载测试工具k6比JMeter更容易的5件事

    k6是GitHub上提供的开源负载测试工具.它是用Go编写的,并运行用JavaScript编写的测试脚本.它受到了开发人员,测试人员和DevOps团队的强烈兴趣,并拥有超过4400名GitHub明星. ...

  6. sublime前端必备插件

    1,docblockr     javascr 和 CSS快捷注释插件 在javascript中  写出函数后,/**+回车 就会出现下面函数注释补全. -----/** * @param {[typ ...

  7. laravel5集成支付宝alipay扫码支付流程(Laravel 支付解决方案)

    首先我们来探讨如何在Laravel应用中使用支付宝进行支付,对此,GitHub上有很多相关的包,其中最流行的两个包:Omnipay For Laravel 5 & Lumen 和 Larave ...

  8. ARM与FPGA通过spi通信设计2.spi master的实现

    这里主要放两个代码第一个是正常的不使用状态机的SPI主机代码:第二个是状态机SPI代码 1.不使用状态机:特权同学<深入浅出玩转FPGA>中DIY数码相框部分代码: /////////// ...

  9. vue 常用语法糖

    //来自 https://www.cnblogs.com/lhl66/p/8021730.html 侵删 el:element 需要获取的元素,一定是HTML中的根容器元素 data:用于数据的存储 ...

  10. Web项目发布后字体文件找不到

    一.问题 ①ASP.NET项目,开发工具Visual Studio ②在IIS上发布之后,网页控制台报错,某某文件找不到,但是在服务器文件夹中看明明有那个文件 二.解决方法 ①>>打开II ...