验证进栈出栈的合法性
2016-04-16 23:36
309 查看
题目:
给两个序列,可以用数组来存储,一个数组存放进栈的顺序,一个数组存储出栈的顺序,要求检查这两个序列是否符合进栈和出栈匹配
方法:
(1)用一个辅助栈,将入栈序列的第一个元素压栈,看是否和出栈序列的第一个元素相等
(2)相等则将辅助栈中的元素弹出,继续比较入栈序列的下一个元素和出栈序列的下一个元素是否相等,
(3)若不想等则将继续将下一个入栈序列的元素压栈并且判断它是否与出栈序列的当前元素
若入栈元素遍历完,而辅助栈为空,则说明入栈序列中的元素和出栈序列中的元素匹配,返回true
若辅助栈不为空,则说明不匹配,返回false
程序:
测试代码:
给两个序列,可以用数组来存储,一个数组存放进栈的顺序,一个数组存储出栈的顺序,要求检查这两个序列是否符合进栈和出栈匹配
方法:
(1)用一个辅助栈,将入栈序列的第一个元素压栈,看是否和出栈序列的第一个元素相等
(2)相等则将辅助栈中的元素弹出,继续比较入栈序列的下一个元素和出栈序列的下一个元素是否相等,
(3)若不想等则将继续将下一个入栈序列的元素压栈并且判断它是否与出栈序列的当前元素
若入栈元素遍历完,而辅助栈为空,则说明入栈序列中的元素和出栈序列中的元素匹配,返回true
若辅助栈不为空,则说明不匹配,返回false
程序:
//验证进栈出栈的合法性 template<class T> bool CheckStack(const T *sPush,const T *sPop, size_t sizein,size_t sizeout) { assert(sPush && sPop); assert(sizein && sizeout); if (sizein != sizeout) return false; stack<T> s; int i = 0; int j = 0; for ( i = 0; i < sizein; i++) { s.push(sPush[i]); while (j<sizeout) { if (!s.empty() && s.top() == sPop[j]) { s.pop(); j++; } else { break; } } } if (!s.empty()) { return false; } else return true; }
测试代码:
void TestCheckStack() { int a[] = { 1, 2, 3, 4, 5 }; int b[] = {1,2,3,4,5}; size_t sizein = sizeof(a) / sizeof(a[0]); size_t sizeout = sizeof(a) / sizeof(a[0]); cout << CheckStack(a, b, sizein,sizeout) << endl; }
相关文章推荐
- 分治法求最接近点对问题
- 2015年简短总结
- HDU 5666 快速乘
- leetcode 16: 3 Sum closest (C#版)
- MFC CStatic类动态创建
- VLC播放RTSP视频延迟问题
- 利用链表实现多项式求值
- VS2013中 scanf()函数返回值
- Jersey(1.19.1) - Security
- Linux防止“rm -rf /”误操作的方法
- Merge OUTPUT 高级用法综合写的一个MergeTab的存储过程
- POJ-1655 Balancing Act
- 数据平台的简单使用
- SLAM学习
- Django:之ORM、CMS和二维码生成
- Windows server 2012R2安装活动目录
- 方便学习的一些经典网站
- HDU 5665
- 使用 PDO 方式将 Session 保存到 MySQL 数据中
- 抛砖微信公众号应用开发