Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรมสร้าง Maximum Stack ด้วยการดำเนินการที่กำหนดใน C++


สมมติว่าเราต้องการสร้างสแต็กสูงสุด ซึ่งรองรับการดำเนินการต่อไปนี้ -

  • MaxStk() สิ่งนี้จะสร้างอินสแตนซ์ใหม่ของสแต็กสูงสุด

  • push(val) แทรก val ไปยังสแต็ก

  • top() รับองค์ประกอบสูงสุดจาก stack

  • max() รับองค์ประกอบสูงสุดจากสแต็ก

  • pop() ลบและส่งคืนองค์ประกอบสูงสุดจากสแต็ก

  • popmax() ลบและส่งคืนองค์ประกอบสูงสุดจากสแต็ก

ตอนนี้สร้างสแต็กสูงสุดโดยเรียก MasStk() จากนั้นกดสามค่าเช่น 5, 15, 10 จากนั้นเรียกใช้ฟังก์ชัน top(), max(), popmax(), max() pop(), top() ตามลำดับ จากนั้นสถานะสแต็กเริ่มต้นจะเป็น [5, 15, 10] และเอาต์พุตที่สอดคล้องกันสำหรับฟังก์ชัน:10, 15, 15, 10, 10, 5

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • pos_index :=0

  • กำหนดหนึ่งชุด stk อีกชุด aux

  • กำหนดคอนสตรัคเตอร์ สิ่งนี้ไม่ได้ทำงานพิเศษใดๆ

  • กำหนดฟังก์ชัน push() ซึ่งจะใช้ค่า val

  • แทรก pos_index , val ลงใน stk

  • แทรก val, pos_index ลงใน aux

  • (เพิ่ม pos_index ขึ้น 1)

  • กำหนดฟังก์ชัน top()

  • ถ้า stk ว่างเปล่า −

    • กลับ -1

  • ส่งคืนค่าที่สองของรายการแรกของ stk

  • กำหนดฟังก์ชัน max()

  • ถ้า aux ว่างเปล่า −

    • กลับ -1

  • ส่งคืนค่าแรกของรายการแรกของ aux

  • กำหนดฟังก์ชัน pop()

  • ถ้า stk ว่างเปล่า −

    • กลับ -1

  • id :=ค่าแรกของรายการแรกของ stk, ret =ค่าที่สองของรายการแรกของ stk

  • ลบองค์ประกอบแรกของ stk ออกจาก stk

  • ลบคู่ (ret, id) จาก aux

  • รีเทิร์น

  • กำหนดฟังก์ชัน popmax()

  • ถ้า aux ว่างเปล่า −

    • กลับ -1

  • ret :=ค่าแรกของรายการแรกของ aux, id =ค่าที่สองของรายการแรกของ aux

  • ลบองค์ประกอบแรกของ aux ออกจาก aux

  • ลบคู่ (id, ret) จาก stk

  • รีเทิร์น

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
class MaxStk {
   int pos_index = 0;
   set<pair<int, int>, greater<>> stk, aux;
   public:
   MaxStk() {}
   void push(int val) {
      stk.emplace(pos_index, val);
      aux.emplace(val, pos_index);
      pos_index++;
   }
   int top() {
      if (stk.empty())
      return −1;
      return stk.begin()−>second;
   }
   int max() {
      if (aux.empty())
      return −1;
      return aux.begin()−>first;
   }
   int pop() {
      if (stk.empty())
      return −1;
      int id = stk.begin()−>first, ret = stk.begin()−>second;
      stk.erase(stk.begin());
      aux.erase({ret, id});
      return ret;
   }
   int popmax() {
      if (aux.empty())
      return −1;
      int ret = aux.begin()−>first, id = aux.begin()−>second;
      aux.erase(aux.begin());
      stk.erase({id, ret});
      return ret;
   }
};
int main(){
   MaxStk max_stk;
   max_stk.push(5);
   max_stk.push(15);
   max_stk.push(10);
   cout << max_stk.top() << endl;
   cout << max_stk.max() << endl;
   cout << max_stk.popmax() << endl;
   cout << max_stk.max() << endl;
   cout << max_stk.pop() << endl;
   cout << max_stk.top() << endl;
}

อินพุต

max_stk.push(5)
max_stk.push(15)
max_stk.push(10)
max_stk.top()
max_stk.max()
max_stk.popmax()
max_stk.max()
max_stk.pop()
max_stk.top()

ผลลัพธ์

10
15
15
10
10
5