📖 Scenario: Imagine you have a list of daily temperatures. For each day, you want to find the next day when the temperature will be higher. This helps you plan when to wear lighter clothes.
🎯 Goal: You will build a program that finds the next greater element for each number in a list using a stack. The next greater element is the first number to the right that is bigger.
📋 What You'll Learn
Create a vector called nums with the exact values: 4, 5, 2, 25
Create an empty stack of integers called stack
Create a vector called result of the same size as nums filled with -1
Use a for loop with variable i from 0 to nums.size() - 1
Inside the loop, use a while loop to check if stack is not empty and nums[i] is greater than nums[stack.top()]
Update result[stack.top()] with nums[i] and pop from stack
Push i onto stack
After the loop, print the result vector elements separated by spaces
💡 Why This Matters
🌍 Real World
Finding the next greater element helps in stock price analysis, weather forecasting, and planning tasks where future higher values matter.
💼 Career
Understanding stack-based algorithms is important for software engineering roles that involve data processing, optimization, and real-time systems.
Progress0 / 4 steps
1
Create the input vector
Create a vector of integers called nums with these exact values: 4, 5, 2, 25
DSA C++
Hint
Use std::vector<int> nums = {4, 5, 2, 25}; to create the vector.
2
Set up stack and result vector
Create an empty stack of integers called stack and a vector of integers called result with the same size as nums, filled with -1
DSA C++
Hint
Use std::stack<int> stack; and std::vector<int> result(nums.size(), -1);
3
Find next greater elements using stack
Use a for loop with variable i from 0 to nums.size() - 1. Inside it, use a while loop to check if stack is not empty and nums[i] is greater than nums[stack.top()]. Inside the while loop, set result[stack.top()] = nums[i] and pop from stack. After the while loop, push i onto stack.
DSA C++
Hint
Use a for loop from 0 to nums.size() - 1. Inside, use a while loop to compare nums[i] with nums[stack.top()]. Update result and pop from stack inside the while loop. Push i onto stack after.
4
Print the result vector
Use a for loop with variable i from 0 to result.size() - 1 and print each element of result followed by a space. Then print a newline.
DSA C++
Hint
Use a for loop to print each element of result followed by a space, then print a newline.
Practice
(1/5)
1. What does the Next Greater Element problem using a stack find for each element in an array?
easy
A. The first greater element to the right of each element
B. The first smaller element to the left of each element
C. The sum of all elements greater than the current element
D. The last element in the array
Solution
Step 1: Understand the problem goal
The Next Greater Element problem aims to find, for each element, the first element to its right that is larger than it.
Step 2: Identify the role of the stack
A stack helps track elements for which we haven't found a greater element yet, allowing efficient lookup of the next greater element.
Final Answer:
The first greater element to the right of each element -> Option A
Quick Check:
Next Greater Element = first bigger right element [OK]
Hint: Look right for the first bigger number using a stack [OK]
Common Mistakes:
Confusing next greater with next smaller element
Thinking it finds elements to the left
Assuming it sums elements instead of finding one
2. Which of the following C++ code snippets correctly declares a stack to be used for Next Greater Element?
easy
A. stack<int> s = new stack<int>();
B. stack<int> s();
C. std::stack s<int>;
D. std::stack<int> s;
Solution
Step 1: Recall correct stack declaration syntax in C++
The standard way to declare a stack of integers is std::stack<int> s; which creates an empty stack named s.
Step 2: Identify incorrect syntax in other options
stack<int> s = new stack<int>(); uses 'new' which is not needed and incorrect here. std::stack s<int>; has wrong template syntax. stack<int> s(); declares a function, not a stack variable.
Final Answer:
std::stack<int> s; -> Option D
Quick Check:
std::stack<int> s; is correct stack declaration [OK]
Hint: Use std::stack<int> s; to declare stack of integers [OK]
Common Mistakes:
Using 'new' keyword incorrectly
Wrong template syntax like s<int>
Declaring stack as a function
3. What is the output of the following C++ code for Next Greater Element?
std::vector<int> arr = {4, 5, 2, 25};
std::vector<int> nge(arr.size(), -1);
std::stack<int> s;
for (int i = 0; i < arr.size(); i++) {
while (!s.empty() && arr[i] > arr[s.top()]) {
nge[s.top()] = arr[i];
s.pop();
}
s.push(i);
}
for (int x : nge) std::cout << x << " ";
medium
A. -1 -1 -1 -1
B. 25 25 -1 -1
C. 5 25 25 -1
D. 5 2 25 -1
Solution
Step 1: Trace the loop and stack operations
Start with empty stack and nge = [-1, -1, -1, -1].
- i=0: push 0 (value 4)
- i=1: 5 > 4, so nge[0]=5, pop 0, push 1
- i=2: 2 < 5, push 2
- i=3: 25 > 2, nge[2]=25, pop 2; 25 > 5, nge[1]=25, pop 1; push 3
Hint: Push indices, update nge when current > top element [OK]
Common Mistakes:
Printing values instead of indices
Not popping stack after updating nge
Confusing greater with smaller elements
4. Identify the bug in this Next Greater Element code snippet:
std::vector<int> arr = {2, 7, 3, 5, 4, 6, 8};
std::vector<int> nge(arr.size(), -1);
std::stack<int> s;
for (int i = arr.size() - 1; i >= 0; i--) {
while (!s.empty() && arr[i] > s.top()) {
s.pop();
}
if (!s.empty()) nge[i] = s.top();
s.push(arr[i]);
}
medium
A. Stack should store indices, not values
B. Loop direction should be from 0 to arr.size() - 1
C. nge vector should be initialized with zeros
D. Comparing arr[i] with s.top() instead of arr[s.top()]
Solution
Step 1: Analyze stack usage in code
The stack stores values (arr[i]) but comparisons and nge assignments expect indices to access arr elements correctly.
Step 2: Explain why storing indices is needed
Storing indices allows referencing original array elements for comparison and updating nge. Storing values breaks logic when multiple same values exist.
Final Answer:
Stack should store indices, not values -> Option A
Quick Check:
Stack stores indices for correct comparisons [OK]
Hint: Stack must hold indices to access original array [OK]
Common Mistakes:
Storing values instead of indices in stack
Looping in wrong direction without adjusting logic
Initializing nge with wrong default values
5. Given an array {13, 7, 6, 12}, how would you modify the Next Greater Element algorithm using a stack to find the Next Greater Element to the LEFT instead of the right?
hard
A. Traverse array from right to left, use stack to track elements, pop smaller elements, assign top as NGE to left.
B. Traverse array from left to right, use stack to track elements, pop smaller elements, assign top as NGE to left.
C. Traverse array from left to right, use stack to track elements, pop greater elements, assign top as NGE to left.
D. Traverse array from right to left, use stack to track elements, pop greater elements, assign top as NGE to left.
Solution
Step 1: Understand direction change for Next Greater to LEFT
To find the next greater element on the left, we must scan from left to right, so we see all elements before current.
Step 2: Use stack to track candidates and pop smaller elements
While scanning, pop elements smaller than current from stack. The top of stack after popping is the next greater element to the left.
Final Answer:
Traverse array from left to right, use stack to track elements, pop smaller elements, assign top as NGE to left. -> Option B
Quick Check:
Left NGE needs left-to-right scan and pop smaller elements [OK]
Hint: Scan left to right, pop smaller, top is left NGE [OK]
Common Mistakes:
Scanning right to left for left NGE
Popping greater elements instead of smaller
Confusing next greater with next smaller element
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.