Stack Implementation Using Array in DSA C - Time & Space Complexity
We want to understand how fast stack operations run when using an array.
Specifically, how does the time to push or pop items change as the stack grows?
Analyze the time complexity of the following code snippet.
#define MAX 100
int stack[MAX];
int top = -1;
void push(int x) {
if (top == MAX - 1) return; // stack full
stack[++top] = x;
}
int pop() {
if (top == -1) return -1; // stack empty
return stack[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: Single assignment or retrieval in array for push and pop.
- How many times: Each push or pop does this once, no loops involved.
Each push or pop does a fixed number of steps regardless of stack size.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 1 operation per push or pop |
| 100 | 1 operation per push or pop |
| 1000 | 1 operation per push or pop |
Pattern observation: The time does not increase as the stack grows; it stays constant.
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 gets bigger because the array is bigger."
[OK] Correct: The code accesses only one position in the array each time, so the size does not affect the time.
Knowing that stack operations are very fast and constant time helps you explain why stacks are useful in many programs.
"What if we used a linked list instead of an array for the stack? How would the time complexity change?"
Practice
Solution
Step 1: Understand stack storage
A stack stores elements in a linear order where the last added element is accessed first.Step 2: Role of array in stack
An array provides a fixed-size linear structure to hold stack elements in order.Final Answer:
To store elements in a fixed-size linear structure -> Option AQuick Check:
Array = fixed-size linear storage [OK]
- Thinking array allows automatic resizing
- Confusing stack with random access structures
- Assuming array sorts elements automatically
Solution
Step 1: Recall C array declaration syntax
In C, arrays are declared as: type name[size];Step 2: Match syntax with options
int stack[5]; matches correct syntax: int stack[5];Final Answer:
int stack[5]; -> Option BQuick Check:
C array declaration = int stack[5]; [OK]
- Placing type after variable name
- Using incorrect keywords like 'array'
- Misplacing brackets in declaration
int stack[3];
int top = -1;
// Push 10
stack[++top] = 10;
// Push 20
stack[++top] = 20;
// Pop
int x = stack[top--];
printf("%d", stack[top]);Solution
Step 1: Trace push operations
Initially top = -1.
Push 10: top becomes 0, stack[0] = 10.
Push 20: top becomes 1, stack[1] = 20.Step 2: Trace pop and print
Pop: x = stack[1] = 20, then top becomes 0.
Print stack[top] = stack[0] = 10.Final Answer:
10 -> Option CQuick Check:
After pop, top points to 10 [OK]
- Printing popped element instead of current top
- Confusing pre-increment and post-decrement
- Assuming top points beyond last element
void push(int stack[], int *top, int size, int value) {
if (*top == size) {
printf("Stack Overflow\n");
return;
}
stack[++(*top)] = value;
}Solution
Step 1: Understand top indexing in stack
Top starts at -1, max index is size - 1.
When top == size - 1, stack is full.Step 2: Analyze overflow condition
Condition *top == size is wrong; it should be *top == size - 1 to detect full stack.Final Answer:
Change condition to *top == size - 1 -> Option DQuick Check:
Overflow when top reaches size-1 [OK]
- Checking top == size instead of size-1
- Misusing increment operators in array indexing
- Ignoring zero-based indexing
push(5); push(10); pop(); push(15); push(20); pop(); push(25);
Assume top starts at -1 and push/pop update top accordingly. Choose the correct final stack content from bottom to top.
Solution
Step 1: Trace each operation step-by-step
Start: top = -1, stack empty.
push(5): top=0, stack[0]=5
push(10): top=1, stack[1]=10
pop(): removes 10, top=0
push(15): top=1, stack[1]=15
push(20): top=2, stack[2]=20
pop(): removes 20, top=1
push(25): top=2, stack[2]=25Step 2: Final stack content
Stack from bottom (index 0) to top (index 2): 5, 15, 25Final Answer:
5 -> 15 -> 25 -> null -> Option AQuick Check:
Push/pop update top correctly [OK]
- Forgetting to update top after pop
- Assuming pop removes bottom element
- Mixing order of elements after operations
Ready to prove it?
Pass the test and this pattern moves unknown
