题目:输入两个整数序列。其中一个序列表示栈的push顺序,
判断另一个序列有没有可能是对应的pop顺序。
为了简单起见,我们假设push序列的任意两个整数都是不相等的。
比如:
输入的push序列是1,2,3,4,5 ,那么4,5,3,2,1就有可能是一个pop序列。
因为可以有如下的push和pop序列:
push 1, push 2, push 3, push 4, pop, push 5, pop, pop, pop, pop
这样的的得到的pop序列就是4,5,3,2,1.
但是序列4,3,5,1,2就不可能是push序列1,2,3,4,5的pop序列。因为我可以模拟如下:
push 1, push 2, push 3, push 4, pop(4), pop(3), push 5, pop(5), pop(2)--->得不到1
分析:
在例子中我们可以看到判断的过程,我们可以用程序模拟这个过程。
请看代码实现:
#include<iostream> using namespace std; template<int MAXSIZE=1024> class Stack{ private: int data[MAXSIZE]; int pos; public: Stack():pos(0){} bool empty() { return pos == 0; } bool full() { return pos == MAXSIZE; } bool get(int& _value) { if(empty()) return false; _value = data[pos-1]; return true; } bool pop(int& _value) { if(empty()) return false; _value = data[--pos]; return true; } bool push(int& _value) { if(full()) return false; data[pos] = _value; pos ++; return true; } }; bool trueSequence(int* push_str,int len, int* pop_str) { if(len == 0) return true; int i = 0; int j = 0; Stack<1024> s; while(i < len) { int v; if( j < len && pop_str[i] == push_str[j]) { i ++; j ++; continue; } else { if(s.get(v)) { if(v!= pop_str[i]) { if(j >= len) break; s.push(push_str[j]); j ++; } else { s.pop(v); i ++; } } else { if(j >= len) break; s.push(push_str[j]); j ++; } } } if(i == j) return true; else return false; } int main() { int push1[5] = {1,2,3,4,5}; int pop1[5] = {4,5,3,2,1}; if(trueSequence(push1, 5, pop1)) cout << "push Sequence:1 2,3,4,5; 4,5,3,2,1 is a pop sequence" << endl; else cout << "push Sequence:1 2,3,4,5; 4,5,3,2,1 is not a pop sequence" << endl; int pop2[5] = {4,3,5,1,2}; if(trueSequence(push1, 5, pop2)) cout << "push Sequence:1 2,3,4,5; 4,3,5,1,2 is a pop sequence" << endl; else cout << "push Sequence:1 2,3,4,5; 4,3,5,1,2 is not a pop sequence" << endl; return 0; }
输出结果为:push Sequence:1 2,3,4,5; 4,5,3,2,1 is a pop sequence
push Sequence:1 2,3,4,5; 4,3,5,1,2 is not a pop sequence