介绍

栈(stack) : 具有先进后出,后进先出的特点。

  • C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,——也就是说实现了一个先进后出(FILO)的数据结构。
empty()   堆栈为空则返回真
pop()     移除栈顶元素
push()    在栈顶增加元素
size()    返回栈中元素数目
top()     返回栈顶元素

C++ stack 的栈是不能遍历的

  • 队列(Queue) : 具有先进先出的特点。
q.empty()               如果队列为空返回true,否则返回false
q.size()                返回队列中元素的个数
q.pop()                 删除队列首元素但不返回其值
q.front()               返回队首元素的值,但不删除该元素
q.push()                在队尾压入新元素
q.back()                返回队列尾元素的值,但不删除该元素

stack

题目1:获取stack中最大的元素

解题思路:使用2个stack,一个是常规的stack,另一个stack 存储在比较过程中大的元素。

class stackWithMax
{private:stack<int> valueStack;stack<int> maxStack;public:void push(int);int pop();int max();
};void stackWithMax::push(int value)
{if(maxStack.empty() || maxStack.top() <=value){maxStack.push(value);}valueStack.push(value);
}int stackWithMax::pop()
{int value=valueStack.top();valueStack.pop();if(value == maxStack.top()){maxStack.pop()}return value;
}int stackWithMax::max()
{return maxStack.pop();
}

题目2:通过stack 实现队列Queue

我们知道stack输出顺序和queue的顺序是相反的
解题思路: 通过两个,互相倾倒的方式,当一个的元素,倾倒另一个上,从而使得原来栈中最后出栈的元素最先出栈,从而颠倒了出栈的顺序

class Queue
{private:
stack<int> inputStack;
stack<int> outputStack;
public:
void enqueue(int);
int dequeue();
];void Queue::enqueue(int value)
{inputStack.push(value);
}int Queue::dequeue()
{int value;if(!outputStack.empty()){value=outputStak.top();outputStack.pop();return value;}while(!inputStack.empty()){.outputStack.push(inputStack.top())inputStack.pop();}value=outputStack.top();outputStack.pop();return value;
}

题目3: 如何对Stack进行升序排列

解题思路:假设使用两个Stack A 和 B ,队列A中元素是没有顺序的,将队列A中的元素有序的加入队列B中,从队列A中取一个元素,假设该元素不符合队列B当前的排列顺序,我们就取stackB上的元素,直到元素可以按顺序入栈。

stack<int> sort(stack<int> &input)
{stack<int> output;while(!input.empty()){int value=input.top();input.pop();while(!output.empty() && output.top <value){input.push(output.top())output.pop();}output.push(value);}return output;
}

“save or latter” 问题

有一类问题有这样的特性:当前节点的解依赖后驱节点。
对于某一类当前节点,如果不能获知后驱节点,就无法得到有意义的解。这类问题可以通过stack(或等同于stack的若干个临时变量)

解决:先将当前节点入栈,然后看其后续节点的值,直到其依赖的所有节点都完备时,再从栈中弹出该节点求解。某些时候,甚至需要反复这个过程:将当前节点的计算结果再次入栈,直到其依赖的后续节点完备。

题目1:验证括号的有效性

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

注意:空字符串可被认为是有效字符串

思路

由于要对照字符串对称位置上的括号是否对应,决定采用栈来解决这一问题,若字符串长度不为偶数则直接返回false,遍历字符串,读到前括号时入栈,读到后括号时若栈空则返回false,若栈不空则用栈顶元素与其比较,能对应则出栈,不能则返回false。最后检查栈空,若空则返回true

代码实现:

bool isLeftParentheses(char left,char right)
{return input == '(' || input == '['  || input == '{';
}bool isMatchParentheses(char left,char right)
{swithc(left){case '(':return right == ')';case '[':return right == ']';case '{':return right == '}';}return false;
}bool isValidParentheses(string input)
{stack<char> parenthesesStack;for(int i=0;i<input.length;i++){if(isLeftParentheses(input[i]))parenthesesStack.push(input[i]);else:{if (parenthesesStack.empty() || !isMatchParentheses(parenthesesStack.top(),inut[i])){return false;}else if(!parenthesesStack.empty() && isMatchParentheses(parenthesesStack.top(),inut[i]) ){parenthesesStack.pop();}else{return false;}}}return parenthesesStack.empty();
}

代码2

{class Solution {public:bool isValid(string s) {if(s.size()%2!=0){return false;}stack <char>stk;for(int i=0;i<s.size();i++){if(s[i]=='('||s[i]=='{'||s[i]=='['){stk.push(s[i]);}else{if(stk.empty()){return false;}else{if(s[i]==')'&&stk.top()=='('){stk.pop();}else if(s[i]=='}'&&stk.top()=='{'){stk.pop();}else if(s[i]==']'&&stk.top()=='['){stk.pop();}else{return false;}}}}return stk.empty();}
};}

参考博客:C++有效的括号

用stack解决Top-Down结构的问题

所谓的Top-Down结构,从逻辑理解角度来看,实际上就是一种树形结构,从顶层出发,逐渐向下扩散,例如二叉树的周游问题。在实际运算的时候,我们先解决子问题,再利用子问题的结构解决当前问题。

由于Stack的LIFO特征,可以利用Stack数据结构消除递归。Recursion通常用函数调用自身实现,在系统调用的时候系统会分配额外的空间,并且需要用指针记录返回的位置,故overhead比较大

题目1: 二叉树的中序遍历

中序遍历:首先遍历根结点的左子树,然后访问根结点,最后中序遍历其右子树。

未完待续。。。

C++练习11: 栈 和队列相关推荐

  1. Suzy找到实习了吗Day 11 |栈与队列中途 20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

    Day 11 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值 20. 有效的括号 注意栈不是一个数据结构,需要自己用list实现栈的逻辑 class Solu ...

  2. 大话数据结构-栈与队列

    文章知识点来至于大话数据结构里边章节知识, 这篇主要介绍栈与队列在计算机中存储形式, 以及在某些算法领域中对栈和队列的相关应用.章节最后介绍了著名的逆波兰表达式, 以及通过算法来实现该表达式的运算过程 ...

  3. 数据结构——栈与队列操作(用栈模拟队列)

    [栈与队列操作] 问题描述:假设有两个长度相同的栈 S1,S2,已知以下入栈.出栈.判栈满和判栈空操作: void Push(S,x); Elemtype Pop(S); bool StackFull ...

  4. 栈和队列应用之数制转换

    数制转换是将任意一个非负的十进制数转换为其他进制的数,一般的方法是采用辗转相除法.参考<C#数据结构> N          N/8        N%8 5142        642  ...

  5. 《大话数据结构》读书笔记-栈与队列

    写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书. 文章目录 4.2栈的定义 4.2.1 栈的定义 4.2.2 进栈出栈变 ...

  6. 算法练习day7——190325(比较器、不基于比较的排序、maxGap、数组实现栈和队列、minStack)

    1.比较器 1.1 Arrays.sort() Arrays.sort(数组) 若其中的数组元素时自定义类型,报错: 若为基本类型,则按值排序. Arrays.sort(数组,自己定义的比较器): 会 ...

  7. 数据结构与算法(C语言) | 栈和队列——栈(自己做过测试)

    栈是一种重要的线性结构,通常称,栈和队列是限定插入和删除只能在表的"端点"进行的线性表.(后进先出) –栈的元素必须"后进先出". –栈的操作只能在这个线性表的 ...

  8. 数据结构与算法--利用栈实现队列

    利用栈实现队列 上一节中说明了栈的特点 后进先出,我们用数组的方式实现了栈的基本操作api,因此我们对栈的操作是不考虑排序的,每个api的操作基本都是O(1)的世界,因为不考虑顺序,所以找最大,最小值 ...

  9. 剑指offer---用两个栈实现队列

    题目:用两个栈实现队列 要求:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 1 class Solution 2 { 3 public: 4 void push ...

  10. python 栈和队列_python 栈和队列的基本实现

    python中的列表结构可以用来实现栈和队列. [栈]: 栈是一种数据结构,具有先入后出的特点,并且栈的所有操作只能在某一端进行,能进行操作的一端的第一个元素称为栈顶,另一端的第一个元素称为栈底 栈的 ...

最新文章

  1. Transformer论文阅读(一): Attention is all you need
  2. 【mybatis mapper XML】List类型入参参数处理
  3. 如何自建appender扩展Log4j框架
  4. 在Linux使用exec执行命令时报的哪些错
  5. Android可视化环境配置搭建方法
  6. TypeScript算法专题 - blog1.基于TypeScript语言的单链表实现
  7. vsto 批量删除列
  8. 微信发红包的测试点有哪些? 评论/点赞/分享/收藏/收索/上传/下载
  9. 《具体数学》(二)和式
  10. MATLAB linspace函数
  11. mpu6050 z轴校准_MPU6050校准
  12. 获取海康摄像机的rtsp流,并用VLC测试
  13. LATEX 罗马数字的输入
  14. 【IoT】 产品设计:结构设计之加胶和减胶
  15. 最全的Office 2003图标集合
  16. mysq根据首字母模糊检索,拼音首字母模糊查询名称
  17. 使用面阵相机进行传送带视频流的拼接
  18. 2022年终结——人生中最美好的一站
  19. 用js创建audio对象实现网页迷你音乐播放器
  20. 给大家推荐一个比较好的VC论坛【VC驿站】

热门文章

  1. 通常所说微型计算机的奔3,求江西省2011年计算机等级一级考试试题
  2. 关于textarea中的回车符
  3. 利用iconfont.css生成html代码,显示iconfont里面的所有的图标
  4. 【前沿技术RPA】 一文了解UiPath 机器人企业框架 (REFramework)
  5. 第9章第19节:继续商业模式幻灯片的制作 [PowerPoint精美幻灯片实战教程]
  6. 前端资源大杂烩(插件、工具、教程)
  7. 电子制造ERP管理系统在仓库管理中的应用
  8. 自学编程的妙方法,直接省了几万块钱报班,不收藏就可惜了!
  9. rmarkdown入门
  10. 虚拟人,你们着实有点抢镜了(doge)