输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈顺序,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。
首先,可以在第一个序列也就是压栈顺序中找第二个序列中第一个元素,是4,因为第二个序列中第一个元素是第一个被弹出的,那么在压入顺序中,被弹出数据之前的所有数据都被压入了栈中且还没有被弹出,也就是连续压进去了1、2、3、4,然后弹出第一个数据4;之后在第二个序列中往后的元素,是5,如果不是栈顶元素就在第一个序列中从4开始往后找继续压入再弹出,再次往后取第二个序列中的元素,如果是栈顶元素就弹出,直到栈空且两个序列都遍历一遍为止,否则,如果栈不为空且两个序列都遍历过了,则说明第二个序列不是压栈序列的弹出序列。
程序设计如下:
#include <iostream> #include <stack> #include <assert.h> using namespace std; bool IsPopSeq(int *push_arr, int *pop_arr, size_t size) { assert(push_arr && pop_arr && size);//判断参数的有效性 stack<int> s; size_t push_index = 0; size_t pop_index = 0; while(pop_index < size) { //将输入队列中处于输出队列第一个元素之前的所有元素都压入栈内 while(push_index < size) { s.push(push_arr[push_index]); ++push_index; if(s.top() == pop_arr[pop_index]) break; } //判断,如果输入队列全部压完了但仍然没有找到输出队列的的第一个元素,就返回false if((!s.empty()) && (s.top() != pop_arr[pop_index])) return false; //当栈中的元素恰好就是输出队列的弹出顺序时就不断的弹出 while((!s.empty()) && (pop_arr[pop_index] == s.top())) { s.pop(); ++pop_index; } } //正确返回的条件就是当输入队列和输出队列都遍历完毕且栈为空时判断完成 if((push_index == size) && (pop_index == size) && s.empty()) return true; else return false; } int main() { int push_arr[] = {1, 2, 3, 4, 5}; int pop_arr1[] = {4, 5, 3, 2, 1}; int pop_arr2[] = {4, 3, 5, 1, 2}; int pop_arr3[] = {2, 5, 3, 4, 1}; size_t size = sizeof(push_arr)/sizeof(push_arr[0]); bool ret = IsPopSeq(push_arr, pop_arr1, size); cout<<ret<<endl; ret = IsPopSeq(push_arr, pop_arr2, size); cout<<ret<<endl; ret = IsPopSeq(push_arr, pop_arr3, size); cout<<ret<<endl; return 0; }
运行程序:
从上面的数组可以判断结果分别为true,false,false。
《完》
本文出自 “敲完代码好睡觉zzz” 博客,请务必保留此出处http://2627lounuo.blog.51cto.com/10696599/1775709
原文地址:http://2627lounuo.blog.51cto.com/10696599/1775709