剑指offer面试题之栈的压入、弹出序列
2016-03-26 18:01
555 查看
1,问题:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
2,想法:
既然是关于栈,首先想到栈的应用,用一个辅助栈,
当栈空时,从进栈序列中进一个,判断栈顶元素是否与出栈序列的第一个元素相同;
若不相同就继续从进栈序列中进一个;
若相同,则出栈,出栈序列的指标指向下一个元素,
按照这种思想,进栈序列肯定会全部进到辅助栈里边,若出栈序列是一个正确的序列,则辅助栈到最后就会变空,
若最后辅助栈不为空,则不是一个正确的出栈序列。
3,编码为:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
2,想法:
既然是关于栈,首先想到栈的应用,用一个辅助栈,
当栈空时,从进栈序列中进一个,判断栈顶元素是否与出栈序列的第一个元素相同;
若不相同就继续从进栈序列中进一个;
若相同,则出栈,出栈序列的指标指向下一个元素,
按照这种思想,进栈序列肯定会全部进到辅助栈里边,若出栈序列是一个正确的序列,则辅助栈到最后就会变空,
若最后辅助栈不为空,则不是一个正确的出栈序列。
3,编码为:
class Solution { public: bool IsPopOrder(vector<int> pushV,vector<int> popV) { if (pushV.empty() || popV.empty()) { return false; } if (pushV.size() != popV.size()) { return false; } unsigned int length = pushV.size(); unsigned int i, j; stack<int> temp; for (i = 0, j = 0; i < length && j < length;) { if (temp.empty()) { temp.push(pushV[i]); i++; } while (i < length && temp.top() != popV[j])//这些while循环 { //必须先判断i是否小于length才能进行下一步 temp.push(pushV[i]); i++; } while (j < length && temp.top() == popV[j]) { temp.pop(); j++; } } /*if (i >= length && j >= length) { return true; } else return false; */ return temp.empty(); } //对于这种判断条件很是陌生!!!!!!写了好久才出来!!!! };
相关文章推荐
- 复制:高效程序员的45个习惯敏捷开发修炼之道 读书笔记
- IOS面试题一
- [面试] 算法(一) —— Str2Int
- java工程师最新面试题(线程部分)
- 知乎上一个关于Android面试的问题答案
- 产品面试指南
- 阿里JAVA开发面试常问问题总结1
- 程序员的出路
- 终生受益的职业规划(转自惠普前总裁)
- How to be a programmer中文版
- 基础的重要性 (程序员之路)
- 经典算法面试题(二)
- 开发工程师的职场人生路(转)
- Java String常见面试题汇总
- 【面试】shuffle函数的实现
- 面试宝典之三 百度软研
- 面试宝典之三 百度软研
- 面试宝典之三 百度软研
- 面试宝典之二 百度算法面试题分析
- 面试宝典之二 百度算法面试题分析