[置顶] 【数据结构】 出栈序列的合法性【面试】
2016-05-26 12:26
423 查看
之前我们对栈已经有所了解,先进后出,后进先出这是栈的两大特性,那么,我们经常会碰到这种题,例:
有一组元素abcdef,按先后顺序进栈,那么出栈时哪些情况是非法的?
A. fedcba
B. abdcef
C. acbdef
D. abcdef
选哪个呢???
很明显,根据栈的两大特性:先进后出,后进先出,即可判断,答案:C
剖析: 先看C选项acb这样的出栈序列,那么进栈肯定是abc,那么显然出栈时c肯定不会在b之前,就这么简单。用代码实现这个合法性的判断,当然也是比较容易的,只要思路逻辑清楚,就没有问题。
代码如下:#include <iostream>
#include <stack>
#include <cassert>
using namespace std;
bool isLegalSequence(const char* Push_seq,const char* Pop_seq)
{
assert(Push_seq);
assert(Pop_seq);
//判断出入栈序列长度是否相等
if ( strlen(Push_seq) != strlen(Pop_seq) )
return false;
stack<char> stk;
while ( *Push_seq)
{
// 先判断栈是否为空,然后判断栈顶元素是否和出栈序列的元素相同
if (0 == stk.size() || stk.top() != *Pop_seq)
{
stk.push(*Push_seq++); // 不相同就压栈,继续向后找
}
else
{
stk.pop(); //找到相同的,出栈
++Pop_seq; //跳到出栈序列的下一个元素验证
}
}
while (stk.size()) // 将剩余的出栈序列元素判断
{
if (stk.top() != *Pop_seq)
{
return false;
}
stk.pop();
}
return true;
}
int main()
{
char* str1 = "abcdef";
char* str2 = "baedcf";
cout << ( isLegalSequence(str1, str2) ? "yes" : "no" ) << endl;
system("pause");
return 0;
}由于系统的栈是现成的,我们可以直接拿来使用,这样问题大大简化,具体的实现步骤过程,代码中也有注释,简单易懂。
本文出自 “Vs吕小布” 博客,请务必保留此出处http://survive.blog.51cto.com/10728490/1763188
有一组元素abcdef,按先后顺序进栈,那么出栈时哪些情况是非法的?
A. fedcba
B. abdcef
C. acbdef
D. abcdef
选哪个呢???
很明显,根据栈的两大特性:先进后出,后进先出,即可判断,答案:C
剖析: 先看C选项acb这样的出栈序列,那么进栈肯定是abc,那么显然出栈时c肯定不会在b之前,就这么简单。用代码实现这个合法性的判断,当然也是比较容易的,只要思路逻辑清楚,就没有问题。
代码如下:#include <iostream>
#include <stack>
#include <cassert>
using namespace std;
bool isLegalSequence(const char* Push_seq,const char* Pop_seq)
{
assert(Push_seq);
assert(Pop_seq);
//判断出入栈序列长度是否相等
if ( strlen(Push_seq) != strlen(Pop_seq) )
return false;
stack<char> stk;
while ( *Push_seq)
{
// 先判断栈是否为空,然后判断栈顶元素是否和出栈序列的元素相同
if (0 == stk.size() || stk.top() != *Pop_seq)
{
stk.push(*Push_seq++); // 不相同就压栈,继续向后找
}
else
{
stk.pop(); //找到相同的,出栈
++Pop_seq; //跳到出栈序列的下一个元素验证
}
}
while (stk.size()) // 将剩余的出栈序列元素判断
{
if (stk.top() != *Pop_seq)
{
return false;
}
stk.pop();
}
return true;
}
int main()
{
char* str1 = "abcdef";
char* str2 = "baedcf";
cout << ( isLegalSequence(str1, str2) ? "yes" : "no" ) << endl;
system("pause");
return 0;
}由于系统的栈是现成的,我们可以直接拿来使用,这样问题大大简化,具体的实现步骤过程,代码中也有注释,简单易懂。
本文出自 “Vs吕小布” 博客,请务必保留此出处http://survive.blog.51cto.com/10728490/1763188
相关文章推荐
- AVL Trees 学习笔记
- 实现一个基于LinkedList的队列数据结构,去除ArrayList集合中重复的元素,
- JavaScript数组实现数据结构中的队列与堆栈
- 数据结构与算法的分析 —— 渐进复杂度(三个记号)
- 数据结构和算法 – 8.链表
- 数据结构与算法的分析 —— 平均时间复杂度 vs 分摊时间复杂度
- 通用块层、IO调度层以及设备驱动层的数据结构
- 数据库索引-数据结构
- 数据结构索引-InnoDB索引
- 堆 (数据结构)
- 数据结构与算法-快速排序算法(java实现)
- 堆 (数据结构)
- 数据结构(C++)—— 向量(Vector)
- 数据结构与算法的分析
- 模拟实现顺序表
- 图形的遍历方法之先广后深法
- 算法的时间复杂度和空间复杂度杂谈
- caffe中的数据结构解析
- 数据结构实验之栈:行编辑器
- 树-Path Sum II(指定和,求根到叶子的路径)