Discover how a simple stack can save you hours of tedious stock price checks!
Why Stock Span Problem Using Stack in DSA Python?
Imagine you are tracking daily stock prices on paper. For each day, you want to know how many consecutive previous days had prices less than or equal to today's price.
Doing this by checking every previous day manually for hundreds of days is tiring and confusing.
Manually comparing each day's price with all previous days takes a lot of time and effort.
It is easy to make mistakes, especially when the list is long.
This slow method cannot keep up with real-time stock updates.
The Stock Span Problem uses a stack to quickly find how many consecutive previous days had lower or equal prices.
This method checks only necessary days, skipping unnecessary comparisons.
It makes the process fast and error-free.
for i in range(len(prices)): span = 1 j = i - 1 while j >= 0 and prices[j] <= prices[i]: span += 1 j -= 1 spans[i] = span
stack = [] for i, price in enumerate(prices): while stack and prices[stack[-1]] <= price: stack.pop() spans[i] = i + 1 if not stack else i - stack[-1] stack.append(i)
This concept enables fast calculation of stock spans for large data sets in real-time.
Stock traders use this to quickly understand price trends and make decisions without waiting for slow calculations.
Manual checking of previous days is slow and error-prone.
Using a stack skips unnecessary comparisons and speeds up the process.
Stock Span Problem solution helps in real-time stock analysis.
Practice
Solution
Step 1: Understand the problem goal
The Stock Span Problem finds how many days before today had prices less than or equal to today's price consecutively.Step 2: Clarify what is counted
It counts consecutive days backward until a higher price is found or start is reached.Final Answer:
The number of consecutive days before the current day with price less than or equal to current day's price -> Option BQuick Check:
Span counts consecutive lower/equal prices [OK]
- Thinking it counts all previous days regardless of price
- Confusing span with price difference
- Assuming it finds max price instead
Solution
Step 1: Identify correct stack data structure
In Python, a stack is commonly implemented using a list, so an empty stack is an empty list: stack = []Step 2: Check other options
{} is a dictionary, () is a tuple (immutable), None is no value, so they are incorrect for stack.Final Answer:
stack = [] -> Option CQuick Check:
Empty list is stack [OK]
- Using {} which is a dictionary, not stack
- Using () which is immutable tuple
- Assigning None instead of a list
def calculate_span(prices):
stack = []
span = [0]*len(prices)
for i in range(len(prices)):
while stack and prices[stack[-1]] <= prices[i]:
stack.pop()
span[i] = i + 1 if not stack else i - stack[-1]
stack.append(i)
return span
print(calculate_span(prices))Solution
Step 1: Trace the loop and stack operations
For each price, pop indices with prices ≤ current price, then calculate span as distance from last higher price index or i+1 if none.Step 2: Calculate spans for each day
Day 0: stack empty, span=1; Day 1: price 80 ≤ 100? No pop, span=1; Day 2: 60 ≤ 80? No pop, span=1; Day 3: 70 > 60 pop index 2, span=2; Day 4: 60 ≤ 70 no pop, span=1; Day 5: 75 > 60 pop index 4, 75 > 70 pop index 3, span=4; Day 6: 85 > 75 pop index 5, 85 > 100 no pop, span=6.Final Answer:
[1, 1, 1, 2, 1, 4, 6] -> Option AQuick Check:
Span array matches expected output [OK]
- Not popping all smaller or equal prices
- Calculating span as i instead of difference
- Confusing span with price values
def stock_span(prices):
stack = []
span = []
for i in range(len(prices)):
while stack and prices[stack[-1]] < prices[i]:
stack.pop()
if not stack:
span.append(i)
else:
span.append(i - stack[-1])
stack.append(i)
return span
print(stock_span([10, 4, 5, 90, 120, 80]))Solution
Step 1: Check span calculation for first day
When stack is empty, span should be i+1 (1 for first day), but code appends i (0 for first day), causing wrong span.Step 2: Confirm other parts are correct
Stack initialization and popping logic are fine; comparison operator < is acceptable; function returns span list correctly.Final Answer:
Span for first day should be 1, but code appends 0 -> Option DQuick Check:
Span for day 0 must be 1 [OK]
- Appending i instead of i+1 when stack empty
- Using wrong comparison operator causing wrong pops
- Not initializing span list properly
Solution
Step 1: Understand current comparison
Current algorithm uses <= to pop indices with prices less than or equal to current price, including equal prices in span.Step 2: Modify to exclude equal prices
To exclude equal prices, change comparison to strictly less than (<) so equal prices stop popping and are not included in span.Final Answer:
Change the comparison in while loop to prices[stack[-1]] < prices[i] -> Option AQuick Check:
Use < to exclude equal prices [OK]
- Using <= keeps equal prices included
- Adding extra conditions unnecessarily
- Assuming no change is needed
Ready to prove it?
Pass the test and this pattern moves unknown
