Computer >> Máy Tính >  >> Lập trình >> C ++

Kiểm tra xem một mảng có thể sắp xếp ngăn xếp trong C ++ hay không

Giả sử chúng ta có một số mảng gồm các phần tử duy nhất từ ​​1 đến n. Chúng ta phải kiểm tra xem nó có thể sắp xếp được hay không. Một mảng có thể sắp xếp ngăn xếp khi nó có thể được lưu trữ trong một số mảng khác bằng cách sử dụng một ngăn xếp tạm thời.

Để giải quyết vấn đề này, chúng ta có thể sử dụng bất kỳ thao tác nào trong số này trên mảng -

  • Xóa phần tử bắt đầu của mảng và đẩy mục đó vào ngăn xếp.

  • Xóa phần tử trên cùng của ngăn xếp và chèn nó vào cuối mảng thứ hai.

Bây giờ nếu tất cả phần tử của mảng đã cho được chuyển sang mảng thứ hai bằng các phép toán này để mảng thứ hai được sắp xếp theo thứ tự không giảm, thì mảng đã cho có thể sắp xếp theo ngăn xếp.

Vì vậy, nếu đầu vào giống như nums =[8, 6, 5, 3, 1], thì đầu ra sẽ là True vì chúng ta có thể xoay hai lần theo chiều kim đồng hồ thì nó sẽ được sắp xếp như [1, 3, 4, 5, 6, 8]

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • Xác định một stk ngăn xếp
  • cuối cùng:=0
  • để khởi tạo i:=0, khi tôi
  • nếu stk không trống, thì -
    • top:=phần tử hàng đầu của stk
    • trong khi đầu giống như (cuối cùng + 1), làm -
      • cuối cùng:=last + 1
      • bật ra từ stk
      • nếu stk trống, thì:
        • Ra khỏi vòng lặp
      • top:=phần tử hàng đầu của stk
    • nếu stk trống, thì:
      • đẩy v [i] vào stk
    • Mặt khác
      • top:=phần tử hàng đầu của stk
      • if v [i]
      • đẩy v [i] vào stk
    • Mặt khác
      • trả về false
  • Mặt khác
    • đẩy v [i] vào stk
  • trả về true
  • Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

    Ví dụ

    #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);
    }

    Đầu vào

    {8, 6, 5, 3, 1}

    Đầu ra

    1