## Introduction to Data Structures and Abstract Data Types(ADTs)

### What is a Data Structures?

Data structures are fundamental concepts in computer science that allow us to organize and manipulate data efficiently. They provide a way to store and retrieve data, perform operations on it, and represent relationships between different pieces of information.

A data structure can be thought of as a way of organizing and managing data in a computer's memory. It defines the layout and behavior of data storage, as well as the operations that can be performed on the stored data. The choice of a data structure depends on the specific problem or task at hand and the requirements for efficient data access and manipulation.

### Classification and Types of Data Structures

Data structures can be broadly classified into two categories: linear data structures and non-linear data structures.

Linear Data Structures: Linear data structures are those in which data elements are organized and accessed sequentially, following a specific order or arrangement. Examples of linear data structures include:

Arrays, Linked Lists, Stacks, Queues - Deques

Non-linear Data Structures: Non-linear data structures are those in which data elements are organized and accessed in a non-sequential or hierarchical manner. Examples of non-linear data structures include:

Trees, Graphs, Hash Tables, Heaps, Tries

## Abstract Data Types

Abstract Data Types (ADTs) are high-level descriptions of data structures that focus on the behavior and operations performed on the data, rather than the specific implementation details. They define a set of operations that can be performed on the data and the constraints or properties associated with those operations.

ADTs allow programmers to work with data structures at a conceptual level without worrying about internal implementation by encapsulating data and operations into a single entity. They act as a blueprint or template for the creation of data structure instances or objects.

The idea behind ADTs is to separate the interface (operations and properties) of a data structure from its implementation. This separation of concerns allows for flexibility and modularity in software design, as different implementations of the same ADT can be used interchangeably as long as they adhere to the defined interface.

## Types of ADTs

Some commonly used ADTs include:

Stack: An ADT that supports operations like push, pop, and peek, following the Last-In-First-Out (LIFO) principle.

Queue: An ADT that supports operations like enqueue, dequeue, and peek, following the First-In-First-Out (FIFO) principle.

List: An ADT that represents an ordered collection of elements, typically supporting operations like insertion, deletion, and retrieval.