Stack Implementation Using Array in DSA Java - Time & Space Complexity
We want to understand how fast stack operations run when using an array.
How does the time to push or pop change as the stack grows?
Analyze the time complexity of the following code snippet.
public class Stack {
private int[] arr;
private int top;
public Stack(int size) {
arr = new int[size];
top = -1;
}
public void push(int x) {
arr[++top] = x;
}
public int pop() {
return arr[top--];
}
}
This code shows how to add (push) and remove (pop) items from a stack using an array.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Each push or pop accesses one array element.
- How many times: Each operation runs once per call, no loops inside.
Each push or pop does a fixed number of steps, no matter how big the stack is.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 1 operation per push/pop |
| 100 | 1 operation per push/pop |
| 1000 | 1 operation per push/pop |
Pattern observation: The time stays the same regardless of stack size.
Time Complexity: O(1)
This means each push or pop takes the same short time no matter how many items are in the stack.
[X] Wrong: "Push or pop takes longer as the stack grows because the array is bigger."
[OK] Correct: The array size does not affect push or pop time because we only access one position directly.
Knowing that stack operations run in constant time helps you explain efficient data handling in many problems.
"What if the array needs to grow dynamically when full? How would the time complexity of push change then?"
Practice
Solution
Step 1: Understand stack storage using array
An array provides a fixed-size linear block of memory to store stack elements sequentially.Step 2: Compare with other storage methods
Unlike linked lists, arrays do not use pointers and have fixed size, so they store elements linearly.Final Answer:
To store elements in a fixed-size linear structure -> Option BQuick Check:
Array = fixed-size linear storage [OK]
- Thinking array allows automatic resizing
- Confusing array with linked list storage
- Assuming random access is main stack feature
Solution
Step 1: Recall Java array declaration syntax
In Java, arrays are declared with type[], variable = new type[size];Step 2: Match correct syntax
int[] stack = new int[10]; matches this syntax: int[] stack = new int[10]; others have syntax errors.Final Answer:
int[] stack = new int[10]; -> Option AQuick Check:
Java array declaration = int[] name = new int[size]; [OK]
- Missing 'new' keyword
- Wrong placement of brackets
- Assigning array without 'new'
Stack s = new Stack(3); s.push(10); s.push(20); s.pop(); s.push(30); s.push(40);
Assuming push prints "Pushed: value" and pop prints "Popped: value".
Solution
Step 1: Trace push and pop operations on stack size 3
push(10) prints "Pushed: 10" stack:[10]; push(20) "Pushed: 20" [10,20]; pop() "Popped: 20" [10]; push(30) "Pushed: 30" [10,30]; push(40) "Pushed: 40" [10,30,40] (capacity 3, net 3 elements).Step 2: Identify outputs printed
All pushes and pop print their messages; no overflow since 3 <= capacity 3.Final Answer:
"Pushed: 10\nPushed: 20\nPopped: 20\nPushed: 30\nPushed: 40" -> Option DQuick Check:
Net 3 elements <= size 3 = no overflow [OK]
- Thinking stack doesn't reuse space after pop
- Miscalculating net elements (3 <= 3)
- Expecting overflow on 3rd net push
public void push(int x) {
if (top == size) {
System.out.println("Stack Overflow");
} else {
stack[top] = x;
top++;
}
}Solution
Step 1: Analyze overflow condition
Since array indices go from 0 to size-1, top == size means stack is full; condition should catch top >= size to prevent overflow.Step 2: Check other options
Changing to size - 1 is incorrect because top points to next free slot; initializing top to 1 or changing increment order is unrelated.Final Answer:
Change condition to if (top >= size) to correctly detect overflow -> Option AQuick Check:
Overflow check = top >= size [OK]
- Using top == size - 1 instead of top >= size
- Incorrect top initialization
- Misunderstanding increment order
Operations:
1) push(5)
2) push(10)
3) pop()
4) push(15)
5) push(10)
Solution
Step 1: Trace operations in order 1,2,3,4,5
push(5) -> [5]; push(10) -> [5,10]; pop() removes 10 -> [5]; push(15) -> [5,15]; push(10) -> [5,15,10]Step 2: Check final stack order bottom to top
Stack is [5,15,10], which is not [5,10,15]. So Perform operations in order: 1, 2, 3, 4, 5 is incorrect. Check other options similarly.Step 3: Trace Perform operations in order: 1, 3, 2, 4, 5 (1,3,2,4,5)
push(5) -> [5]; pop() removes 5 -> []; push(10) -> [10]; push(15) -> [10,15]; push(10) -> [10,15,10] not correct.Step 4: Trace Perform operations in order: 1, 2, 4, 3, 5 (1,2,4,3,5)
push(5) -> [5]; push(10) -> [5,10]; push(15) -> [5,10,15]; pop() removes 15 -> [5,10]; push(10) -> [5,10,10] not correct.Step 5: Trace Perform operations in order: 1, 2, 5, 3, 4 (1,2,5,3,4)
push(5) -> [5]; push(10) -> [5,10]; push(10) -> [5,10,10]; pop() removes 10 -> [5,10]; push(15) -> [5,10,15] correct final stack.Final Answer:
Perform operations in order: 1, 2, 5, 3, 4 -> Option CQuick Check:
Final stack = [5,10,15] after Perform operations in order: 1, 2, 5, 3, 4 [OK]
- Assuming order of operations does not affect stack
- Not simulating pop effects correctly
- Confusing push order with final stack order
Ready to prove it?
Pass the test and this pattern moves unknown
