判断一串无重复数字的有限序列是否可由某种操作得到

输入格式

输入有两行,第一行是一个正整数 N(1≤N≤100),表示输入序列的长度,第二行是序列a,共有 N 个整数,表示要得到的目标序列。序列为 1 到 N 的排列,即序列a长度为 N,保证序列中的整数都不相同,且整数在区间 [1, N] 内。

输出格式

输出一行,如果能通过编写的程序得到序列a,则输出YES,否则输出NO。

样例输入:

  5

  2 1 5 4 3

样例输出:

  YES

考点:栈的操作

首先创建Stack类

 1 class Stack {
 2 private:
 3     int * elements;
 4     int max_size, top_index;
 5 public:
 6     Stack(int input_size) {
 7         max_size = input_size;
 8         elements = new int[max_size];
 9         top_index = -1;
10     }
11     ~Stack() {
12         delete[] elements;
13     }
14     void push(const int &elem) {
15         if (top_index >= max_size - 1) {
16             return;
17         }
18         top_index ++;
19         elements[top_index] = elem;
20     }
21     void pop() {
22         if (top_index < 0) {
23             return;
24         }
25         top_index --;
26     }
27     int top() {
28         assert(top_index >= 0);
29         return elements[top_index];
30     }
31     bool empty() {
32         return top_index < 0;
33     }
34 };
View Code

接下来是重点,main函数

 1 int main() {
 2     int n;
 3     cin >> n;
 4     int arr[n];
 5     Stack stack(n);
 6     int temp = 0;
 7     for (int i = 0; i < n; i++) {
 8         cin >> arr[i];
 9     }
10     for (int i = 0; i < n; i++) {
11         stack.push(i+1);
12         while (!stack.empty()) {
13             if (stack.top() == arr[temp]) {
14                 stack.pop();
15                 temp ++;
16             } else {
17                 break;
18             }
19         }
20     }
21     if (stack.empty()) {
22         cout << "YES" << endl;
23     } else {
24         cout << "NO" << endl;
25     }
26 
27     return 0;
28 }

 

posted @ 2017-09-14 15:36  Xehanort_Hajime  阅读(381)  评论(0)    收藏  举报