我们知道 栈的特性:后进先出 ,
在给定数据入栈顺序的情况下,我们能改变的就是 改变出栈顺序 从而达到不同的效果。但是如果给出了出栈的顺序,我们能通过一个程序检测它是不是 可以由入栈的顺序 得到。
方法:将入栈和出栈的顺序通过两个vector 传进函数,利用一个栈S,每次比较S.top() 和V2的元素 相等则 (S出栈,v2后移);不相等则 (S入栈,V2后移)
代码:
<span style="font-family:Microsoft YaHei;">template<typename T>
bool CheckOutStack(const vector<T>& v1, const vector<T> v2)
{
if (v1.size() != v2.size())
{
return false;
}
stack<T> S;
size_t index1 = 0; //栈S 的下标
size_t index2 = 0; //输出顺序v2的下标
while (index2< v2.size())
{
while (S.empty() || S.top() != v2[index2])//一直找到与 v2的第一个元素相等的位置
{
if (v1.size() > index1) //v1没有全部入 栈S , 继续入栈
{
S.push(v1[index1++]);
}
else //入栈完了 , 还没有相等 则返回false
{
return false;
}
}
//来到下面 说明前面有相等的元素
S.pop();//出栈一次,v2后移一位
index2++;
}
return true;
}</span>
//2016-10-3改进
bool CheckOutStack(const vector<int> v1, const vector<int> v2)
{
int size1 = v1.size();
int size2 = v2.size();
if (size1 != size2)
return false;
stack<int> s;
int index1= 0;
int index2 = 0;
while (size1 >index1)
{
while (s.empty() || v1[index1] != v1[index2]) //不相等才入栈
{
if (size2 > index2) //已经遍历v2都没有发现与v1元素相等的 ,那么就是不合法
{
s.push(v2[index2++]);
}
else
return false;
}
s.pop();
index1++;
}
return true;
}