合法的出栈序列

题目描述

现有一个空栈s和一个正整数n,将1,2,3,...,n依次入栈,期间任意时刻出栈。然后给定一个出栈序列,问其是否是一个合法的出栈序列。

输入描述

第一行一个整数n(1≤n≤100),表示需要入栈的整数个数;

第二行为[1,n]的一个排列,表示一个出栈序列,整数间用空格隔开。

输出描述

如果出栈序列合法,那么输出Yes,否则输出No

样例1

输入

4 3 2 4 1

输出

Yes

解释

初始时栈为空,即[]。接下来按下面的顺序执行即可得到出栈序列3 2 4 1

  1. 1入栈,此时栈为[1]
  2. 2入栈,此时栈为[1,2]
  3. 3入栈,此时栈为[1,2,3]
  4. 3出栈,此时栈为[1,2]
  5. 2出栈,此时栈为[1]
  6. 4入栈,此时栈为[1,4]
  7. 4出栈,此时栈为[1]
  8. 1出栈,此时栈为[]

样例2

输入

4 3 4 1 2

输出

No

解释

无法达成出栈序列3 4 1 2

题解:

#include 
using namespace std;

int main()
{
    int n;
    cin >> n;

    vector v(n);
    for (int i = 0; i < n; ++i) {
        cin >> v[i]; // 读取出栈序列
    }

    stack s; 
    int i = 1; // 入栈元素从1开始
    int j = 0;   // 出栈序列索引

    while (i <= n || !s.empty()) {
        // 如果栈顶元素等于出栈序列的当前值,则弹出
        if (!s.empty() && s.top() == v[j]) {
            s.pop();
            j++;
        }
        // 否则继续入栈
        else if (i <= n) {
            s.push(i);
            i++;
        }
        // 既不能入栈,也无法匹配出栈,说明非法
        else {
            cout << "No";
            return 0;
        }
    }
    cout << "Yes"; // 成功匹配完整的出栈序列
    return 0;
}

 

你可能感兴趣的:(数据结构,c++,学习,开发语言,数据结构)