您的位置:首页 > 其它

22.栈的压入、弹出序列

2017-05-19 20:03 183 查看
给一个栈的压入顺序,判断一个序列是否是这个栈的一个弹出序列。

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

思路:

设栈的压入顺序 pushV:1,2,3,4,5

给一个正确的弹出序列 popV:4,5,3,2,1

借用一个辅助“栈”:stack,来存放临时的元素

int i=0,j=0;

(1)首先,1压入栈,即stack{1},此时popV[0]=4≠1,所以1暂时不弹出;i++,即i=1

(2)然后,2压入栈,即stack{1,2},此时popV[0]=4≠2,所以2也不弹出;i++,即i=2

(3)然后,3压入栈,即stack{1,2,3},此时popV[0]=4≠3,所以3也不弹出;i++,即i=3

(4)然后,4压入栈,即stack{1,2,3,4},此时popV[0]=4,说明4刚压入就弹出了,是第一个弹出的元素;删除stack最后一个元素,即stack{1,2,3};且j++,即j=1;

(5)继续压栈,直到相等以后开始出栈,出栈一个元素,则将出栈顺序向后移动一位,直到不相等,这样循环等压栈顺序遍历完成,如果辅助栈还不为空,说明弹出序列不是该栈的弹出顺序。

代码实现如下:

bool IsPopOrder(vector<int> pushV,vector<int> popV) {
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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: