Different implementation of stack

Comprehensive study notes, diagrams, and exam preparation for Different implementation of stack.

Different Implementation of Stack

Definition

A stack implementation is the method used to store, access, insert, and delete elements in a stack data structure while preserving the LIFO order.

In stack implementation, the operations are usually:

Push

  • : insert an element onto the top of the stack

Pop

  • : remove the top element

Peek/Top

  • : view the top element without removing it

IsEmpty

  • : check whether the stack has no elements

IsFull

  • : check whether the stack has reached its capacity, if applicable

A good stack implementation must ensure that all these operations work correctly and efficiently while maintaining the stack’s ordering rule.


Main Content

1. Stack Implementation Using Array

Structure and working

  • In array-based implementation, the stack elements are stored in a contiguous block of memory.
  • A variable such as top is used to track the index of the most recently inserted element.
  • Initially, top = -1, which means the stack is empty.
  • When an element is pushed, top increases by 1 and the element is stored at that position.
  • When an element is popped, the element at top is removed and top decreases by 1.

Example

  • Suppose a stack has capacity 5 and elements are pushed in this order: 10, 20, 30.
  • After each push, the array may look like:
    Index:  0   1   2   3   4
    Stack: 10  20  30  _   _
    Top:            ^
  • If 30 is popped, then top moves back to index 1.

Advantages and limitations

  • Array implementation is simple and easy to understand.
  • Accessing the top element is very fast.
  • However, the stack size is usually fixed in a normal array, so memory may be wasted if the stack is underused.
  • If the stack becomes full, overflow occurs even if unused memory exists elsewhere in the system.
  • Dynamic arrays can reduce this limitation by resizing, but resizing may occasionally be expensive.

2. Stack Implementation Using Linked List

Structure and working

  • In linked-list implementation, each element is stored in a node containing:
    • data
    • a pointer/reference to the next node
  • The stack’s top is typically the head of the linked list.
  • On push, a new node is created and linked to the current top.
  • On pop, the top node is removed and top is updated to point to the next node.

Example

  • If we push 10, then 20, then 30, the linked list stack becomes:
    Top -> [30 | *] -> [20 | *] -> [10 | NULL]
  • Here, 30 is on the top and will be removed first.

Advantages and limitations

  • Linked list implementation is dynamic, so the stack can grow or shrink as needed until memory is exhausted.
  • It avoids the fixed-size limitation of arrays.
  • It is ideal when the number of elements is not known in advance.
  • However, it requires extra memory for pointers.
  • Memory allocation and deallocation can introduce overhead compared with arrays.

3. Stack Implementation Using Two Queues and Other Methods

Using two queues

  • A stack can also be implemented using two queues while still simulating LIFO behavior.
  • This is a classic method used in data structure exercises and interviews.
  • There are two common strategies:
    • Costly push: make push expensive and pop easy
    • Costly pop: make pop expensive and push easy

How it works

  • In one approach, when an element is pushed, it is enqueued into an empty queue and then all existing elements are moved behind it so that the newest element stays at the front.
  • In another approach, elements are added normally, but when a pop is required, elements are transferred until only the last inserted item remains.

Other methods

  • Recursive implementation can simulate stack behavior using the call stack, though this is mostly theoretical for teaching purposes.
  • Some systems use language-provided stack abstractions such as the call stack, which is internally managed by the runtime.
  • In low-level systems, stacks may also be implemented directly using memory regions with a stack pointer register.

Advantages and limitations

  • This method is useful for understanding how one data structure can simulate another.
  • It is not usually the best choice for performance-critical programs.
  • Operations may become less efficient than direct array or linked list implementations.
  • However, it strengthens conceptual understanding of stacks and queues.

Working / Process

1. Choose the implementation method

  • Decide whether to use an array, linked list, two queues, or another approach based on the problem requirements.
  • If the number of elements is fixed or roughly known, an array may be suitable.
  • If flexible growth is required, a linked list may be better.

2. Perform stack operations according to LIFO

  • In array implementation, maintain an index called top.
  • In linked-list implementation, maintain a pointer to the first node.
  • On every push, insert the new element at the top position.
  • On every pop, remove the element from the top position only.
  • On peek, return the current top element without deletion.

3. Handle boundary conditions

  • Check for overflow in array-based stacks when the maximum size is reached.
  • Check for underflow when a pop is attempted on an empty stack.
  • In linked-list stacks, ensure proper memory management when nodes are created and deleted.
  • In two-queue implementations, ensure that queue transfers are performed correctly so the order remains LIFO.

Advantages / Applications

Efficient last-in-first-out access

  • Stack implementations make it easy to work with the most recently added item quickly and predictably.

Useful in real-world computing tasks

  • Stacks are used in function calls and recursion handling, expression evaluation, syntax parsing, undo/redo operations, and browser navigation history.

Flexible implementation options

  • Different implementations allow developers to choose based on memory constraints, speed requirements, and dynamic size needs.
  • Arrays are often preferred for simplicity and speed.
  • Linked lists are preferred when capacity must be flexible.
  • Two-queue implementations are useful for conceptual learning and problem-solving exercises.

Summary

  • Stack can be implemented using arrays, linked lists, or other supporting data structures.
  • Array implementation is simple and fast but may have fixed size limitations.
  • Linked-list implementation is dynamic and flexible but uses extra memory for links.
  • Different implementations preserve the same LIFO behavior while changing internal storage methods.
  • Important terms to remember: stack, LIFO, push, pop, peek, top, overflow, underflow, array, linked list, queue