您的位置:首页 > 其它

栈的压入、弹出序列

2015-08-27 22:23 337 查看
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

顺序为:push[middle]==pop[0];之后只能从middle--或middle++,一旦从end=size-1开始则只能end--。

class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
int left=0;
int right=0;
int middle=-1;
int push_size=pushV.size();
int pop_size=popV.size();
if(push_size!=pop_size)
return false;
if(push_size==0) return false;
for(int i=0;i<push_size;i++){
if(pushV[i]==popV[0]){
middle=i;
break;
}
}
if(middle==-1) return false;
left=middle-1;
right=middle+1;
int k=1;
int num=push_size-1;
while(left>=0&&right<push_size&&k<pop_size){
if(popV[k]==pushV[left]){
k++;

left--;
continue;
}
if(popV[k]==pushV[right]){
k++;
right++;
continue;
}
if(popV[k]==pushV[num]){
while(k<pop_size){
if(popV[k]==pushV[num]){
k++;
num--;
if(num>left&&num<right)
num=left;
continue;
}
return false;
}
return true;
}
return false;
}
while(left>=0){
if(popV[k]==pushV[left]){
k++;

left--;
continue;
}
return false;
}
while(right<push_size){
if(popV[k]==pushV[right]){
k++;
right++;
continue;
}
return false;
}
return true;
}
};


!较好的方法:

同样的道理,push压入后,只能从当前位置pop,不然只能等下一个数压入后再pop,或等到末尾再pop。

class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
if(pushV.size()!=popV.size())
return false;
if( 0==popV.size())
return false;

vector<int> s;
for(int i=0,j=0;i<pushV.size();i++)
{
s.push_back(pushV[i]);
while(j<popV.size() && s.back()==popV[j])
{
s.pop_back();
j++;
}
}
return s.empty();
/*    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();*/

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: