3-4.栈与队列
来源:互联网 发布:垂直b2b平台 源码 编辑:程序博客网 时间:2024/05/18 03:34
- 写在前面
- 栈
- 1 栈应用
- 11 括号匹配
- 12 栈混洗甄别
- 13 中缀表达式
- 1 栈应用
写在前面
本篇文章整理《数据结构(C++语言版)》关于列表这种线性结构知识点。
整个数据结构部分章节列表如下:
1 向量
– 1.1 遍历
– 1.2 唯一化
– 1.3 查找
2 列表
– 2.1 列表节点
—- 2.1.1前插入算法
– 2.2 列表模板类
—- 2.2.1 列表初始化
3-4 栈与队列
–
3 栈
后进先出(LIFO)是栈这种结构最大的特点。对栈而言,只有一端的可访问称作,顶端top。
栈也是一种线性结构,即满足逻辑地址连续,故可直接基于向量或列表派生。
//基于vector结构的栈初始化template<typename T>class Stack: public Vector<T>{public: void push(T const& e) { insert( size(), e);} //入栈,等效于作为向量末元素插入 T pop() { return remove( size() -1); } //出栈,等效于删除向量末元素 T& top() { return ( *this ) [ size() - 1 ]; } //取顶,直接返回向量的末元素};
3.1 栈应用
基于栈结构的应用,就是要充分利用其后进先出LIFO的特性。
3.1.1 括号匹配
解决问题:判断一个只含括号的表达式是否匹配。
算法:从表达式左侧开始扫描,当扫描到左括号(
则压入栈中,若扫描到右括号)
则弹出栈顶元素,继续扫描下去。当且仅当最后扫描完成时,栈类所有左括号(
均已弹出,栈为空栈时该表达式括号匹配。
代码实现
bool paren( char exp[], int lo, int hi ) { //exp[lo, hi) Stack<char> s; for(int i=lo; i < hi; i++){ if( '(' == exp[i] ) s.push(exp[i]); //若左括号,入栈 else if( !s.empty() ) s.pop(); //若右括号,且栈非空,弹出栈顶 else return false; //若括号表达式未扫描结束,栈已空,则不匹配 } return s.empty();}
TIPS:字符串与字符数组
字符串以空字符\0
结尾,用来标记字符串的结尾。
char dog[4] = {‘a’, ‘b’, ‘c’, ‘d’}; //不是字符串,是char数组
char cat[4] = {‘a’, ‘b’, ‘c’, ‘\0’}; //是字符串,也是char数组
另一种操作方法是通过双引号声明字符串,若声明长度比实际长度长,则空字符将自动补全到实际长度之后。
char bird[5] = “abc”; //实际为 abc\0\0
char bird[] = “abc”; //编译器自己判断字符串长度
3.1.2 栈混洗甄别
解决问题:将栈A中的元素通过栈S转移入栈B中。对元素的移入移出操作只允许以入栈出栈方式。进而判断栈B中元素序列是否是一种栈混洗。
算法:不妨设栈A的元素为升序排列。对栈B中第i个元素,当其从栈S弹出前,S栈顶端以下元素按降序排列。即,若栈S顶元素小于B[i],则依次将A中元素入栈;若栈S顶元素等于B[i],则S出栈,继续判断B[i+1];若栈S顶元素大于B[i],则不是栈混洗。
该算法的一个典型应用场景为火车调度问题。
代码实现
/*判断栈B中序列是否为一种栈混洗为了简化问题,栈A、B元素确定,因此可以通过数组等方式实现。/*int A = 1;int B[] = {2, 3, 1, 4, 5};bool Stackverfi(int A, const int* array_B){ Stack<int> S; for(int i = 0; i < 5; i++){ while( S.top() < B[i] ){ S.push(A++); std::cout << "push\n"; } if( S.top() == B[i] ){ S.pop(); std::cout << "pop\n"; } else{ std::cout << "NO!!!"; return false; } }}
3.1.3 中缀表达式
- 3-4.栈与队列
- 栈与队列(3)
- 栈与队列->队列
- 栈、队列与优先队列
- 数据结构笔记(3)栈与队列
- 数据结构3:队列与栈专题
- 栈与队列
- 堆与栈 队列
- 队列与栈
- 16 栈与队列
- 栈与队列
- 【数据结构】栈与队列
- 栈与队列
- 栈与队列....
- 栈与队列
- 栈与队列专题
- 栈与队列
- CC_3_栈与队列
- jQuery随机抽中手机号码抽奖代码
- Yii框架学习之路
- MYSQL实现Oracle的Start with…Connect By递归树查询
- TestNG实现日志输出
- JQuery validate 下拉菜单验证
- 3-4.栈与队列
- Python checkio Pawn Brotherhood解决方案
- 2017.12.08日记
- Java调用Kettle时,报Can't run transformation due to plugin missing错误的解决方法
- jsp分页
- 一台服务器实现nginx代理负载均衡同时使用web服务
- Mybatis实战 之 Settings
- 公开课发布《轻松学习机器学习算法原理》by晓伟
- MS-SQL中取用户连续签到的次数