检查数组在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

    以上是 检查数组在C ++中是否可以堆栈排序 的全部内容, 来源链接: utcz.com/z/361388.html

    回到顶部