C++练习11: 栈 和队列
介绍
栈(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: 栈 和队列相关推荐
- Suzy找到实习了吗Day 11 |栈与队列中途 20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值
Day 11 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值 20. 有效的括号 注意栈不是一个数据结构,需要自己用list实现栈的逻辑 class Solu ...
- 大话数据结构-栈与队列
文章知识点来至于大话数据结构里边章节知识, 这篇主要介绍栈与队列在计算机中存储形式, 以及在某些算法领域中对栈和队列的相关应用.章节最后介绍了著名的逆波兰表达式, 以及通过算法来实现该表达式的运算过程 ...
- 数据结构——栈与队列操作(用栈模拟队列)
[栈与队列操作] 问题描述:假设有两个长度相同的栈 S1,S2,已知以下入栈.出栈.判栈满和判栈空操作: void Push(S,x); Elemtype Pop(S); bool StackFull ...
- 栈和队列应用之数制转换
数制转换是将任意一个非负的十进制数转换为其他进制的数,一般的方法是采用辗转相除法.参考<C#数据结构> N N/8 N%8 5142 642 ...
- 《大话数据结构》读书笔记-栈与队列
写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书. 文章目录 4.2栈的定义 4.2.1 栈的定义 4.2.2 进栈出栈变 ...
- 算法练习day7——190325(比较器、不基于比较的排序、maxGap、数组实现栈和队列、minStack)
1.比较器 1.1 Arrays.sort() Arrays.sort(数组) 若其中的数组元素时自定义类型,报错: 若为基本类型,则按值排序. Arrays.sort(数组,自己定义的比较器): 会 ...
- 数据结构与算法(C语言) | 栈和队列——栈(自己做过测试)
栈是一种重要的线性结构,通常称,栈和队列是限定插入和删除只能在表的"端点"进行的线性表.(后进先出) –栈的元素必须"后进先出". –栈的操作只能在这个线性表的 ...
- 数据结构与算法--利用栈实现队列
利用栈实现队列 上一节中说明了栈的特点 后进先出,我们用数组的方式实现了栈的基本操作api,因此我们对栈的操作是不考虑排序的,每个api的操作基本都是O(1)的世界,因为不考虑顺序,所以找最大,最小值 ...
- 剑指offer---用两个栈实现队列
题目:用两个栈实现队列 要求:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 1 class Solution 2 { 3 public: 4 void push ...
- python 栈和队列_python 栈和队列的基本实现
python中的列表结构可以用来实现栈和队列. [栈]: 栈是一种数据结构,具有先入后出的特点,并且栈的所有操作只能在某一端进行,能进行操作的一端的第一个元素称为栈顶,另一端的第一个元素称为栈底 栈的 ...
最新文章
- 基数排序中的LSD方法和MSD方法
- javascript同级遍历_有用的DOM遍历方法,你需要了解一下
- AI 质检学习报告——实践篇——第三步:python利用OpenCV打开摄像头截图后实现图片识字
- Django中管理并发操作
- html5手机网站照片查看器,PhotoSwipe
- LPTHW 笨方法学习python 16章
- lua 字符串包含_Programming in Lualua学习第11期 Lua模块与包
- vue下拉框传值问题
- [绝对原创]从VS2003(.net1.1)升级到vs2005(.net2.0)全程跟踪记录
- 专业软件 —— Adobe Audition
- java生成润乾报表,润乾报表----模板报表制作
- python中字符串转元组时的小技巧
- Intel SGX背景、其他可信计算技术和TEE技术(翻译自Intel SGX Explained)
- OSChina 周四乱弹 ——丑到端水水更流,举杯浇丑丑更丑
- 【NOIP模拟】项链
- 雅戈尔关于媒体报道出澄清公告 谨防股价变动
- 2353563-50-3,Thalidomide-O-PEG4-Acid一种鱼精蛋白连接物,在活化剂EDC或HATU存在下可与含胺部分反应
- java 向路由器发送报文_9.IP选路 - loda0128的个人空间 - OSCHINA - 中文开源技术交流社区...
- 算法小程序:倒水问题
- Android版数据结构与算法汇总十二章