剑指Offer - 九度1366 - 栈的压入、弹出序列

剑指Offer - 九度1366 - 栈的压入、弹出序列
2014-02-05 20:41
题目描述:

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

输入:

每个测试案例包括3行:

第一行为1个整数n(1<=n<=100000),表示序列的长度。

第二行包含n个整数,表示栈的压入顺序。

第三行包含n个整数,表示栈的弹出顺序。

输出:

对应每个测试案例,如果第二个序列是第一个序列的弹出序列输出Yes,否则输出No。

样例输入:
5

1 2 3 4 5

4 5 3 2 1

5

1 2 3 4 5

4 3 5 1 2

样例输出:
Yes

No
题意分析:
  给定一个入栈的数列,判断给定的另一个数列是否可能是一个出栈序列。
  要做的第一件事,就是将a[1],a[2],...,a[n]和1,2,...,n进行映射。这样方便判断大小,找到一个判断先后顺序的参照标准。
  接下来,问题就转化成了:如果入栈序列为1,2,...,n,出栈顺序是否可能为a[1],a[2],...,a[n]?
  具体的思路请直接看代码,几个if分支的意思应该比较明确了。过程中需要一个栈来模拟入栈出栈过程。
  时间复杂度为O(n),空间复杂度也是O(n)。
 1 // 688864    zhuli19901106    1366    Accepted    点击此处查看所有case的执行结果    6504KB    916B    640MS

 2 // 201402012335

 3 #include <cstdio>

 4 #include <map>

 5 #include <stack>

 6 using namespace std;

 7 

 8 map<int, int> m2;

 9 stack<int> st;

10 const int MAXN = 100005;

11 int a[MAXN];

12 

13 int main()

14 {

15     int i, j, n;

16     int tmp;

17 

18     while (scanf("%d", &n) == 1) {

19         for (i = 0; i < n; ++i) {

20             scanf("%d", &tmp);

21             m2[tmp] = i;

22         }

23         for (i = 0; i < n; ++i) {

24             scanf("%d", &tmp);

25             a[i] = m2[tmp];

26         }

27 

28         i = j = 0;

29         while (j < n) {

30             if (a[j] == i) {

31                 ++i;

32                 ++j;

33             } else if (!st.empty() && st.top() == a[j]) {

34                 st.pop();

35                 ++j;

36             } else if (i < n) {

37                 st.push(i);

38                 ++i;

39             } else {

40                 break;

41             }

42         }

43         if (i == n && j == n && st.empty()) {

44             printf("Yes\n");

45         } else {

46             printf("No\n");

47         }

48 

49         while (!st.empty()) {

50             st.pop();

51         }

52         m2.clear();

53     }

54 

55     return 0;

56 }

 

你可能感兴趣的:(序列)