检查数组在C ++中是否可以堆栈排序

假设我们有一个从1到n的唯一元素数组。我们必须检查它是否可以堆栈排序。当一个数组可以使用临时堆栈存储在其他数组中时,该数组是可排序的。

为了解决这个问题,我们可以在数组上使用以下任何操作:

  • 删除数组的起始元素,然后将该项目推入堆栈。

  • 删除堆栈的顶部元素,并将其插入第二个数组的末尾。

现在,如果通过这些操作将给定数组的所有元素转移到第二个数组,因此第二个数组以非降序排序,则给定数组是可堆栈排序的。

因此,如果输入类似于nums = [8、6、5、3、1],那么输出将为True,因为我们可以沿顺时针方向旋转两次,然后将其排序为[1、3、4, 5、6、8]

为了解决这个问题,我们将遵循以下步骤-

  • 定义一个堆栈stk

  • 最后:= 0

  • 对于初始化i:= 0,当i <v的大小时,更新(将i增加1),执行-

    • 将v [i]推入stk

    • top:= stk的顶部元素

    • 当top与(last + 1)相同时,执行-

    • 如果stk为空,则:

    • 除此以外

    • 从循环中出来

    • 最后:=最后+ 1

    • 从stk弹出

    • 如果stk为空,则:

    • top:= stk的顶部元素

    • 将v [i]推入stk

    • 返回假

    • 将v [i]推入stk

    • top:= stk的顶部元素

    • 如果v [i] <top,则:

    • 除此以外

    • 如果stk不为空,则-

    • 除此以外

    • 返回真

    让我们看下面的实现以更好地理解-

    示例

    #include <bits/stdc++.h>
    using namespace std;
    bool solve(vector<int> &v) {
       stack<int> stk;
       int last = 0;
       for (int i = 0; i < v.size(); i++) {
          if (!stk.empty()){
             int top = stk.top();
             while (top == last + 1) {
                last = last + 1;
                stk.pop();
                if (stk.empty()){
                   break;
                } top = stk.top();
             }
             if (stk.empty()) {
                stk.push(v[i]);
             }else{
                top = stk.top();
                if (v[i] < top){
                   stk.push(v[i]);
                }else{
                   return false;
                }
             }
          }else{
             stk.push(v[i]);
          }
       } return true;
    }main(){
       vector<int>
       v = {8, 6, 5, 3, 1};
       cout << solve(v);
    }

    输入值

    {8, 6, 5, 3, 1}
    输出结果
    1

    猜你喜欢