กำหนดอาร์เรย์ของตัวเลขและสแต็ก องค์ประกอบทั้งหมดของอาร์เรย์มีอยู่ในสแต็ก เป้าหมายคือการค้นหาจำนวนการดำเนินการป๊อปที่จำเป็นสำหรับการรับองค์ประกอบอาร์เรย์แต่ละรายการ
สแต็กถูกเติมในลำดับที่ลดลง องค์ประกอบแรกสูงสุด และองค์ประกอบบนสุดคือต่ำสุด
ตัวอย่าง
อินพุต
Stack [ 7,6,2,1 ] array : 2,1,6,7
ผลลัพธ์
Count of number of pop operations on stack to get each element of the array are: 3 1 0 0
คำอธิบาย
Traversing array from 0th index, To get 2 we will pop stack three times. So arr[0] is 3. First two pops will give 7 and 6 also. To get 1 we will pop stack once now. So arr[1] is 1. For 6 and 7 as these are already popped, so arr[2]=arr[3]=0.
อินพุต
Stack [ 3,2,1,1 ] array : 1,2,1,3
ผลลัพธ์
Count of number of pop operations on stack to get each element of the array are: 3 0 1 0
คำอธิบาย
Traversing array from 0th index, To get 1 we will pop stack three times. So arr[0] is 3. First two pops will give 3 and 2 also.Traversing array from 0th index, To get 1 we will pop stack three times. So arr[0] is 3. First two pops will give 3 and 2 also.
แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้ −
ในวิธีนี้เราจะใช้ unordered_map
-
ใช้อาร์เรย์จำนวนเต็ม arr[].
-
นำ stack
stck เพื่อจัดเก็บองค์ประกอบในนั้น -
ดันองค์ประกอบในลำดับที่ลดลง
-
ฟังก์ชัน pop_operations(stack
&stck, int arr[], องค์ประกอบ int) คืนค่าจำนวนการดำเนินการป๊อปบนสแต็กเพื่อรับแต่ละองค์ประกอบของอาร์เรย์ -
นับเริ่มต้นเป็น 0
-
ใช้ unordered_map
um เพื่อจัดเก็บหมายเลขเฉพาะที่พบขณะดำเนินการป๊อปอัพบนสแต็ก -
Traverse array ใช้ for วนซ้ำ
-
ใช้ temp=arr[i].
-
ถ้าอุณหภูมิไม่อยู่ใน um ต้องพิมพ์ 0 ป๊อปอัพจึงจะโหลดได้
-
มิฉะนั้นในขณะที่ไม่พบ temp ให้ดำเนินการป๊อปบนสแต็กและตั้งค่าแต่ละองค์ประกอบที่ปรากฏขึ้นใน um เป็นจริงและนับการเพิ่มขึ้น
-
เมื่อสิ้นสุดระยะเวลาพิมพ์ ให้นับ
-
ด้วยวิธีนี้ เราจะพิมพ์จำนวนการดำเนินการป๊อปสำหรับแต่ละองค์ประกอบของอาร์เรย์
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
void pop_operations(stack<int>& stck, int arr[], int elements){
int count = 0;
unordered_map<int, bool> um;
cout<<"Count of number of pop operations on stack to get each element of the array are: ";
for (int i = 0; i < elements; ++i){
int temp = arr[i];
if (um.find(temp) != um.end())
{ cout << "0 "; }
else{
count = 0;
while (stck.top() != temp){
um[stck.top()] = true;
stck.pop();
count++;
}
stck.pop();
count++;
cout<<count<<" ";
}
}
}
int main(){
int elements = 4;
int arr[] = { 2, 1, 6, 7};
stack<int> stck;
stck.push(1);
stck.push(2);
stck.push(6);
stck.push(7);
pop_operations(stck, arr, elements);
return 0;
} ผลลัพธ์
หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -
Count of number of pop operations on stack to get each element of the array are: 3 1 0 0