栈的压入、弹出序列
2015-01-15 14:35
162 查看
面试题22:栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。
分析:
考研的数据结构中也常有这种题目,解题的基本思路是:如果要得到第二序列中的第一元素需要将那么些元素入栈,然后出栈得到第一个元素,然后判断第二元素是不是在栈顶若不是继续入栈直到序列为空或者得到该元素。文字表达比较绕,画图表示:
假设入栈序列为:1.2.3.4.5需要得到的出栈序列为:4.3.5.1.2
为了得到4那么需要将1.2.3.4入栈,然后4出栈。得到4,然后第二个出栈序列的元素为3,正好位于栈顶,于是出栈,下一个出栈元素为5,于是5入栈、出栈。得到5,下一个是1,此时栈顶元素是2且出栈序列为空,此时结束表示出栈序列不是该栈的弹出顺序。
pPush为入栈序列,pPop为出栈序列,nLength为栈的深度
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。
分析:
考研的数据结构中也常有这种题目,解题的基本思路是:如果要得到第二序列中的第一元素需要将那么些元素入栈,然后出栈得到第一个元素,然后判断第二元素是不是在栈顶若不是继续入栈直到序列为空或者得到该元素。文字表达比较绕,画图表示:
假设入栈序列为:1.2.3.4.5需要得到的出栈序列为:4.3.5.1.2
为了得到4那么需要将1.2.3.4入栈,然后4出栈。得到4,然后第二个出栈序列的元素为3,正好位于栈顶,于是出栈,下一个出栈元素为5,于是5入栈、出栈。得到5,下一个是1,此时栈顶元素是2且出栈序列为空,此时结束表示出栈序列不是该栈的弹出顺序。
pPush为入栈序列,pPop为出栈序列,nLength为栈的深度
bool IsPopOrder(const int* pPush,const int* pPop,int nLength) { bool bPossible = false; if(pPush != NULL && pPop != NULL && nLength>0) { const int* pNextPush = pPush(); const int* pNextPop = pPop(); std::stack<int>stackData; while(pNextPop - pPop < nLength) { while(stackData.empty() || stackData.top() != *pNextPop) { if(pNextPush - pPush == nLength){ break; }//入栈序列全部遍历 stackData.push(*pNextPush); pNextPush ++ ; } if(stackData.top() != *pNextPop) { break; } stackData.pop(); pNextPop++; } if(stackData.empty() && pNextPop - pPop == nLength) { bPossible = true; }//出栈序列全部遍历 } return bPossible; }
相关文章推荐
- 剑指offer题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。
- 剑指offer 22题 【举例让抽象具体化】栈的压入、弹出序列
- 判断栈的压入,弹出序列是否匹配
- 栈的压入弹出序列的合法性
- 面试题22—栈的压入、弹出序列
- 【剑指offer】栈的压入、弹出序列(java版)
- 栈的压入、弹出序列
- 剑指offer-面试题22-栈的压入、弹出序列
- 剑指Offer22栈的压入、弹出序列
- 九度OJ-题目1366:栈的压入、弹出序列
- 面试题22:栈的压入、弹出序列
- 栈的压入、弹出序列
- 九度_题目1366:栈的压入、弹出序列
- 面试题22 已知压入序列 判断弹出序列正不正确
- 剑指offer--栈的压入、弹出序列
- 栈的压入、弹出序列
- 剑指Offer(31)栈的压入,弹出序列
- 【剑指offer】面试题22:栈的压入、弹出序列
- 面试题22 栈的压入、弹出序列
- 栈的压入,弹出序列