📖 Scenario: Imagine you have a row of walls of different heights. When it rains, water gets trapped between these walls. We want to find out how much water is trapped after the rain stops.
🎯 Goal: You will write a program that uses a stack to calculate the total amount of trapped rainwater given the heights of the walls.
📋 What You'll Learn
Create a vector called height with the exact values: {0,1,0,2,1,0,1,3,2,1,2,1}
Create an empty stack of integers called st
Use a while loop and if conditions to implement the trapping rain water logic using the stack
Print the total trapped water as an integer
💡 Why This Matters
🌍 Real World
Calculating trapped rainwater helps in understanding water flow and storage in terrains and urban planning.
💼 Career
This problem is common in coding interviews and helps develop problem-solving skills using stacks and arrays.
Progress0 / 4 steps
1
Create the height vector
Create a vector of integers called height with these exact values: {0,1,0,2,1,0,1,3,2,1,2,1}
DSA C++
Hint
Use std::vector<int> and initialize it with the given values.
2
Create an empty stack and initialize variables
Create an empty stack of integers called st and an integer variable water initialized to 0
DSA C++
Hint
Use std::stack<int> st; to create the stack and int water = 0; to start counting trapped water.
3
Implement the trapping rain water logic using stack
Use a for loop with variable i from 0 to height.size(). Inside the loop, use a while loop to check if the stack is not empty and height[i] is greater than height[st.top()]. Pop the top of the stack into top. If the stack becomes empty, break. Calculate the distance as i - st.top() - 1 and bounded height as std::min(height[i], height[st.top()]) - height[top]. Add distance * bounded_height to water. After the while loop, push i onto the stack.
DSA C++
Hint
Use a for loop to go through each wall. Use a while loop to pop from the stack when current height is greater. Calculate trapped water using distance and bounded height.
4
Print the total trapped water
Print the value of water using std::cout
DSA C++
Hint
Use std::cout << water << std::endl; to print the total trapped water.
Practice
(1/5)
1. What is the main purpose of using a stack in the Trapping Rain Water Using Stack algorithm?
easy
A. To store the total amount of trapped water
B. To keep track of bars that are not yet processed for water trapping
C. To sort the heights of bars in ascending order
D. To reverse the order of the bars
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 B
Quick Check:
Stack tracks bars for trapping water = A [OK]
Hint: Stack holds bars waiting for right boundary [OK]
Common Mistakes:
Thinking stack stores water amount
Assuming stack sorts bars
Confusing stack with array for heights
2. Which of the following C++ code snippets correctly declares a stack to be used for trapping rain water indices?
easy
A. std::stack<int> st;
B. stack<int> st = new stack<int>();
C. std::stack st<int>;
D. stack<int> st();
Solution
Step 1: Check correct C++ stack declaration syntax
Correct syntax is std::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 A
Quick Check:
Correct stack declaration = B [OK]
Hint: Use std::stack<int> st; to declare stack [OK]
Common Mistakes:
Using 'new' keyword incorrectly
Wrong template syntax
Declaring function instead of stack
3. What is the output of the following C++ code snippet that uses stack to calculate trapped rain water?
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;
medium
A. 8
B. 5
C. 6
D. 7
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 C
Quick Check:
Trapped water = 6 [OK]
Hint: Classic example traps 6 units water [OK]
Common Mistakes:
Miscounting distance between bars
Wrong bounded height calculation
Ignoring empty stack break condition
4. Identify the error in the following C++ code snippet for trapping rain water using stack:
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;
medium
A. No break condition inside while loop
B. Missing initialization of water variable
C. Stack should store heights, not indices
D. Using >= instead of > in while condition causes incorrect water calculation
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 D
Quick Check:
Use > not >= in while condition [OK]
Hint: Use > not >= in while condition [OK]
Common Mistakes:
Using >= instead of > in while condition
Storing heights instead of indices in stack
Forgetting break when stack is empty
5. Given the heights array {4, 2, 0, 3, 2, 5}, what is the total trapped rain water calculated using the stack approach?
hard
A. 8
B. 7
C. 9
D. 6
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 A
Quick Check:
Trapped water total = 8 [OK]
Hint: Sum water trapped between boundaries carefully [OK]
Common Mistakes:
Ignoring zero height bars
Miscounting trapped water between bars
Not considering both left and right boundaries
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.