介绍

栈(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. 基数排序中的LSD方法和MSD方法
  2. javascript同级遍历_有用的DOM遍历方法,你需要了解一下
  3. AI 质检学习报告——实践篇——第三步:python利用OpenCV打开摄像头截图后实现图片识字
  4. Django中管理并发操作
  5. html5手机网站照片查看器,PhotoSwipe
  6. LPTHW 笨方法学习python 16章
  7. lua 字符串包含_Programming in Lualua学习第11期 Lua模块与包
  8. vue下拉框传值问题
  9. [绝对原创]从VS2003(.net1.1)升级到vs2005(.net2.0)全程跟踪记录
  10. 专业软件 —— Adobe Audition
  11. java生成润乾报表,润乾报表----模板报表制作
  12. python中字符串转元组时的小技巧
  13. Intel SGX背景、其他可信计算技术和TEE技术(翻译自Intel SGX Explained)
  14. OSChina 周四乱弹 ——丑到端水水更流,举杯浇丑丑更丑
  15. 【NOIP模拟】项链
  16. 雅戈尔关于媒体报道出澄清公告 谨防股价变动
  17. 2353563-50-3,Thalidomide-O-PEG4-Acid一种鱼精蛋白连接物,在活化剂EDC或HATU存在下可与含胺部分反应
  18. java 向路由器发送报文_9.IP选路 - loda0128的个人空间 - OSCHINA - 中文开源技术交流社区...
  19. 算法小程序:倒水问题
  20. Android版数据结构与算法汇总十二章

热门文章

  1. 计算机一级outlook百度云,Outlook2010官方版
  2. Python股票数据分析——策略、收益率计算
  3. m3u8中ts文件无损批量合并与转换方法
  4. 没有目标的人生是可怕的!
  5. python进阶练习之——复读机相加
  6. devops数字化管理_可视化DevOps心态
  7. 尹会生python课程_百家姓之尹姓氏起源、来历
  8. 网页特效源码分析----标签云
  9. UnionPay,ChinaPay 最新 银联支付接口C#\Asp.net\MVC 版本
  10. 观复嘟嘟:职场是个技术活-马未都