आइए मान लें कि जिस स्टैक पर हम काम करेंगे वह यह है:
6 , minvalue=2
2 , minvalue=2
5 , minvalue=3
3 , minvalue=3
9 , minvalue=7
7 , minvalue=7
8 , minvalue=8
उपर्युक्त प्रतिनिधित्व में स्टैक केवल बाएं मूल्य द्वारा बनाया गया है और सही मान [मिनवल्यू] केवल चित्रण उद्देश्य के लिए लिखा गया है जिसे एक चर में संग्रहीत किया जाएगा।
वास्तविक समस्या तब होती है जब मूल्य जो कि न्यूनतम मान है उस बिंदु पर हटा दिया जाता है हम यह कैसे जान सकते हैं कि स्टैक पर पुनरावृत्ति के बिना अगला न्यूनतम तत्व क्या है।
उदाहरण के लिए हमारे स्टैक में जब 6 का पॉपअप मिलता है तो हम जानते हैं कि, यह न्यूनतम तत्व नहीं है क्योंकि न्यूनतम तत्व 2 है, इसलिए हम अपने न्यूनतम मूल्य को अपडेट किए बिना इसे सुरक्षित रूप से हटा सकते हैं।
लेकिन जब हम 2 पॉप करते हैं, तो हम देख सकते हैं कि अभी न्यूनतम मूल्य 2 है और यदि यह पॉप आउट हो जाता है, तो हमें न्यूनतम मूल्य 3 पर अपडेट करना होगा।
Point1:
अब अगर आप ध्यान से देखें तो हमें इस विशेष राज्य [2, minvalue = 2] से मिनवेल्यू = 3 उत्पन्न करने की आवश्यकता है। या यदि आप स्टापर जाते हैं, तो हमें इस विशेष राज्य [3, minvalue = 3] से मिनवेल्यू = 7 उत्पन्न करने की आवश्यकता है या यदि आप स्टैक में अधिक डिपर जाते हैं, तो हमें इस विशेष स्थिति से मिनावेल = 8 उत्पन्न करने की आवश्यकता है - 7, मिनवल्यू = 7]
क्या आपने उपरोक्त सभी 3 मामलों में सामान्य रूप से कुछ देखा है, जो हमें उत्पन्न करने की आवश्यकता है जो दो चर पर निर्भर करता है जो दोनों समान हैं। सही बात। ऐसा क्यों हो रहा है क्योंकि जब हम किसी तत्व को छोटा करते हैं तो वर्तमान खंभे को, तो हम मूल रूप से उस तत्व को ढेर में धकेल देते हैं और उसी संख्या को minvalue में भी अपडेट करते हैं।
अंक 2:
इसलिए हम मूल रूप से एक ही नंबर के डुप्लिकेट को एक बार स्टैक में और एक बार मिनवल्यू वेरिएबल में स्टोर कर रहे हैं। हमें इस दोहराव से बचने पर ध्यान देने और स्टैक या मिनवेल्यू में कुछ उपयोगी डेटा स्टोर करने की आवश्यकता है, जैसा कि ऊपर दिए गए कैसिनो में दिखाया गया है।
आइए इस पर ध्यान दें कि स्टैक में हमें क्या स्टोर करना चाहिए जब पुश में स्टोर करने का मूल्य माइनमवल्यू से कम हो। इस चर y को नाम दें, तो अब हमारा स्टैक कुछ इस तरह दिखेगा:
6 , minvalue=2
y1 , minvalue=2
5 , minvalue=3
y2 , minvalue=3
9 , minvalue=7
y3 , minvalue=7
8 , minvalue=8
मैंने उन्हें भ्रम से बचने के लिए y1, y2, y3 के रूप में नाम दिया है कि उन सभी का मूल्य समान होगा।
Point3:
अब आइए कुछ बाधाओं को y1, y2and y3 पर खोजने का प्रयास करें। क्या आपको याद है कि वास्तव में जब हमें पॉप () करते समय नाबालिग को अपडेट करने की आवश्यकता होती है, केवल तब जब हम उस तत्व को पॉपअप करते हैं जो मिनव्यू के बराबर होता है। यदि हम मीनल्व से कुछ अधिक पॉप करते हैं तो हमें मिनवाल्यू अपडेट करने की आवश्यकता नहीं है। तो मिनवाल्यू के अपडेट को ट्रिगर करने के लिए, y1, y2 & y3, संबंधित मिनवेल्यू से छोटे होने चाहिए। [हम डुप्लिकेट [प्वाइंट 2] से बचने के लिए समानता का लाभ उठा रहे हैं] इसलिए बाधा [y <minValue] है।
अब चलो y को आबाद करने के लिए वापस आते हैं, हमें कुछ मूल्य उत्पन्न करने और पुश के समय y डालने की आवश्यकता है, याद रखें। मान लेते हैं जो पुश के लिए आ रहा है वह x है जो कि कम है जो कि प्रचलित है, और मूल्य जो हम वास्तव में स्टैक में धक्का देंगे y होगा। तो एक बात स्पष्ट है कि newMinValue = x, और y <newMinvalue।
अब हमें y को शांत करने की आवश्यकता है (याद रखें y किसी भी प्रकार का हो सकता है जो newMinValue (x) से कम हो) इसलिए हमें प्राइमिनवेल्यू और x (newininvalue) की सहायता से कुछ संख्या ढूंढनी होगी जो हमारे अवरोध को पूरा कर सके)।
Let's do the math:
x < prevMinvalue [Given]
x - prevMinvalue < 0
x - prevMinValue + x < 0 + x [Add x on both side]
2*x - prevMinValue < x
this is the y which we were looking for less than x(newMinValue).
y = 2*x - prevMinValue. 'or' y = 2*newMinValue - prevMinValue 'or' y = 2*curMinValue - prevMinValue [taking curMinValue=newMinValue].
तो x को पुश करने के समय यदि यह प्राइमिनवल्यू से कम है तो हम y [2 * x-prevMinValue] को पुश करते हैं और newMinValue = x को अपडेट करते हैं।
और पॉप के समय यदि स्टैक में मिनवैल्यू से कुछ कम होता है तो वह मिनव्ल्यू को अपडेट करने के लिए हमारा ट्रिगर है। हमें curMinValue और y से prevMinValue की गणना करनी है। y = 2 * curMinValue - prevMinValue [साबित] prevMinVAlue = 2 * curMinvalue - y।
2 * curMinValue - y वह संख्या है जिसे हमें अब प्राइमवैल्यू में अपडेट करने की आवश्यकता है।
समान तर्क के लिए कोड O (1) समय और O (1) स्थान की जटिलता के साथ नीचे साझा किया गया है।
// C++ program to implement a stack that supports
// getMinimum() in O(1) time and O(1) extra space.
#include <bits/stdc++.h>
using namespace std;
// A user defined stack that supports getMin() in
// addition to push() and pop()
struct MyStack
{
stack<int> s;
int minEle;
// Prints minimum element of MyStack
void getMin()
{
if (s.empty())
cout << "Stack is empty\n";
// variable minEle stores the minimum element
// in the stack.
else
cout <<"Minimum Element in the stack is: "
<< minEle << "\n";
}
// Prints top element of MyStack
void peek()
{
if (s.empty())
{
cout << "Stack is empty ";
return;
}
int t = s.top(); // Top element.
cout << "Top Most Element is: ";
// If t < minEle means minEle stores
// value of t.
(t < minEle)? cout << minEle: cout << t;
}
// Remove the top element from MyStack
void pop()
{
if (s.empty())
{
cout << "Stack is empty\n";
return;
}
cout << "Top Most Element Removed: ";
int t = s.top();
s.pop();
// Minimum will change as the minimum element
// of the stack is being removed.
if (t < minEle)
{
cout << minEle << "\n";
minEle = 2*minEle - t;
}
else
cout << t << "\n";
}
// Removes top element from MyStack
void push(int x)
{
// Insert new number into the stack
if (s.empty())
{
minEle = x;
s.push(x);
cout << "Number Inserted: " << x << "\n";
return;
}
// If new number is less than minEle
if (x < minEle)
{
s.push(2*x - minEle);
minEle = x;
}
else
s.push(x);
cout << "Number Inserted: " << x << "\n";
}
};
// Driver Code
int main()
{
MyStack s;
s.push(3);
s.push(5);
s.getMin();
s.push(2);
s.push(1);
s.getMin();
s.pop();
s.getMin();
s.pop();
s.peek();
return 0;
}