Discover how a simple stack can solve a tricky water-trapping puzzle faster than you ever imagined!
Why Trapping Rain Water Using Stack in DSA C++?
Imagine you have a row of buildings with different heights after a rainstorm. You want to find out how much water is trapped between these buildings. Doing this by checking every possible pair manually is like trying to count water drops between every two buildings by hand -- it's slow and confusing.
Manually checking each gap between buildings to calculate trapped water means repeating many steps and comparing heights again and again. This is slow and easy to make mistakes, especially when buildings vary a lot in height. It's like trying to solve a puzzle without a clear plan.
Using a stack helps keep track of building heights in a smart way. It lets you quickly find where water can be trapped by remembering the last building that might hold water. This way, you don't have to check all pairs manually, making the process faster and less error-prone.
int trappedWater = 0; for (int i = 1; i < n - 1; i++) { int leftMax = /* max height to the left */; int rightMax = /* max height to the right */; trappedWater += min(leftMax, rightMax) - height[i]; }
stack<int> buildingStack; int trappedWater = 0; for (int i = 0; i < n; i++) { while (!buildingStack.empty() && height[i] > height[buildingStack.top()]) { int top = buildingStack.top(); buildingStack.pop(); if (buildingStack.empty()) break; int distance = i - buildingStack.top() - 1; int boundedHeight = min(height[i], height[buildingStack.top()]) - height[top]; trappedWater += distance * boundedHeight; } buildingStack.push(i); }
This method lets you quickly and accurately calculate trapped rainwater in complex building layouts, saving time and avoiding mistakes.
City planners can use this to estimate how much rainwater will collect between buildings to design better drainage systems and prevent flooding.
Manual checking of trapped water is slow and error-prone.
Stack helps track building heights efficiently to find trapped water.
This approach speeds up calculation and reduces mistakes.
Practice
Trapping Rain Water Using Stack algorithm?Solution
Step 1: Understand the role of the stack
The stack stores indices of bars that are waiting to find a right boundary to trap water.Step 2: Explain why other options are incorrect
The stack does not store water amount or sort bars; it helps track bars for water calculation.Final Answer:
To keep track of bars that are not yet processed for water trapping -> Option BQuick Check:
Stack tracks bars for trapping water = A [OK]
- Thinking stack stores water amount
- Assuming stack sorts bars
- Confusing stack with array for heights
Solution
Step 1: Check correct C++ stack declaration syntax
Correct syntax isstd::stack<int> st;to declare a stack of integers.Step 2: Identify errors in other options
stack<int> st = new stack<int>(); uses incorrect syntax with 'new'; C has wrong template placement; D declares a function, not a stack.Final Answer:
std::stack<int> st; -> Option AQuick Check:
Correct stack declaration = B [OK]
- Using 'new' keyword incorrectly
- Wrong template syntax
- Declaring function instead of stack
int height[] = {0,1,0,2,1,0,1,3,2,1,2,1};
int n = 12;
std::stack<int> st;
int water = 0;
for (int i = 0; i < n; i++) {
while (!st.empty() && height[i] > height[st.top()]) {
int top = st.top();
st.pop();
if (st.empty()) break;
int distance = i - st.top() - 1;
int bounded_height = std::min(height[i], height[st.top()]) - height[top];
water += distance * bounded_height;
}
st.push(i);
}
std::cout << water << std::endl;Solution
Step 1: Trace the stack operations and water calculation
The code calculates trapped water for the given heights array using stack logic. The total trapped water is 6 units.Step 2: Verify calculations with known example
This is a classic example where trapped water is 6 units, matching the output of the code.Final Answer:
6 -> Option CQuick Check:
Trapped water = 6 [OK]
- Miscounting distance between bars
- Wrong bounded height calculation
- Ignoring empty stack break condition
std::stack<int> st;
int water = 0;
for (int i = 0; i < height.size(); i++) {
while (!st.empty() && height[i] >= height[st.top()]) {
int top = st.top();
st.pop();
if (st.empty()) break;
int distance = i - st.top() - 1;
int bounded_height = std::min(height[i], height[st.top()]) - height[top];
water += distance * bounded_height;
}
st.push(i);
}
std::cout << water << std::endl;Solution
Step 1: Analyze the while loop condition
The condition uses >= which causes popping bars of equal height, leading to incorrect trapped water calculation.Step 2: Explain correct condition and impact
Using > ensures only bars lower than current are popped, preserving correct boundaries for water trapping.Final Answer:
Using >= instead of > in while condition causes incorrect water calculation -> Option DQuick Check:
Use > not >= in while condition [OK]
- Using >= instead of > in while condition
- Storing heights instead of indices in stack
- Forgetting break when stack is empty
{4, 2, 0, 3, 2, 5}, what is the total trapped rain water calculated using the stack approach?Solution
Step 1: Calculate trapped water between bars using stack logic
Between bars, trapped water units are: 2 units between 4 and 3, 1 unit between 3 and 5, and 5 units between 2 and 5, totaling 8 units.Step 2: Sum trapped water units
Sum of trapped water is 8 units for the given array.Final Answer:
8 -> Option AQuick Check:
Trapped water total = 8 [OK]
- Ignoring zero height bars
- Miscounting trapped water between bars
- Not considering both left and right boundaries
Ready to prove it?
Pass the test and this pattern moves unknown
