检测出栈的合法性问题
2016-04-25 17:29
281 查看
题目:给定一个入栈和一个出栈序列?请判断是否合法
eg:入栈12345,出栈35124
用一个辅助栈,如果栈为空,就push(入栈序列)
比较栈顶元素和出栈序列当前值是否相等,若相等,出栈此元素,并将下次访问出栈序列位置后移;否则,继续入入栈序列里的元素。
重复1,2步骤,直到入栈序列为空,且栈顶元素不等于出栈序列当前访问位置时即不合法。栈空,入栈序列空,出栈序列空为合法出栈。
此例中将3,5,取出后,明显1不是栈顶元素,所以不是合法的。
eg:入栈12345,出栈35124
用一个辅助栈,如果栈为空,就push(入栈序列)
比较栈顶元素和出栈序列当前值是否相等,若相等,出栈此元素,并将下次访问出栈序列位置后移;否则,继续入入栈序列里的元素。
重复1,2步骤,直到入栈序列为空,且栈顶元素不等于出栈序列当前访问位置时即不合法。栈空,入栈序列空,出栈序列空为合法出栈。
此例中将3,5,取出后,明显1不是栈顶元素,所以不是合法的。
#include<iostream> #include<assert.h> #include<stack> using namespace std; bool IsLegal(const char* inOrder, const char* outOrder) { assert(inOrder&&outOrder); if (strlen(inOrder) != strlen(outOrder)) return false; char* source = (char*)inOrder; char* dest = (char*)outOrder; stack<char> s; char ch; while (!s.empty() || *source != '\0') { while (!s.empty() && s.top()==*dest) { dest++; s.pop(); } if (*source == '\0') break; s.push(*source++); } if (*dest == '\0') return true; else return false; } //法二 class Solution { public: bool IsPopOrder(vector<int> pushV,vector<int> popV) { if(pushV.size() == 0) return false; vector<int> stack; for(int i = 0,j = 0 ;i < pushV.size();){ stack.push_back(pushV[i++]); while(j < popV.size() && stack.back() == popV[j]){ stack.pop_back(); j++; } } return stack.empty(); } }; void Test1() { cout << IsLegal("12345", "35124") << endl; cout << IsLegal("12345", "54321") << endl; cout << IsLegal("12345", "35421") << endl; cout << IsLegal("12345", "23451") << endl; cout << IsLegal("12345", "12345") << endl; }
相关文章推荐
- javascript实现检验的各种规则
- Cisco 基本检验和配置命令集
- android内存检测
- 判断出栈顺序的合法性(面试题)
- 关于给定栈求出所有合法栈的思考
- 校验中文、空格和特殊符号的方法
- web工程导入时遇到的一些问题及解决方法
- 张涵20160401作业
- 张涵20160401作业
- 张涵20160401作业
- 20160401作业张涵
- 20160401作业 张涵
- 监理师课程4月1题作业
- yum
- 判断元素出栈,入栈顺序的合法性
- 软件包管理—rpm
- AOP之PostSharp2-OnMethodBoundaryAspect
- 架构设计-业务逻辑层简述 推荐
- 检查数据库数据字段命名规范和合法性的脚本
- yum总结以及应用