Dynamic data structures are essential for creating flexible and efficient programs that can handle varying amounts of data. In this section, we will explore the concept of dynamic data structures in ALGOL, including their definition, types, and practical implementation.

What are Dynamic Data Structures?

Dynamic data structures are data structures that can grow and shrink at runtime, allowing for efficient memory usage and flexibility in handling data. Unlike static data structures, which have a fixed size, dynamic data structures can adapt to the needs of the program.

Key Concepts:

  • Dynamic Allocation: Memory is allocated at runtime.
  • Flexibility: Can grow and shrink as needed.
  • Efficiency: Optimizes memory usage.

Types of Dynamic Data Structures

In ALGOL, the most common dynamic data structures include:

  1. Linked Lists
  2. Stacks
  3. Queues
  4. Trees

Linked Lists

A linked list is a sequence of elements, where each element points to the next one. It allows for efficient insertion and deletion of elements.

Example:

begin
  integer node;
  record nodeType (integer value; ref nodeType next);
  ref nodeType head, temp;

  head := new nodeType;
  head.value := 10;
  head.next := new nodeType;
  head.next.value := 20;
  head.next.next := nil;

  temp := head;
  while temp != nil do
  begin
    print(temp.value);
    temp := temp.next;
  end;
end;

Stacks

A stack is a LIFO (Last In, First Out) data structure. Elements are added and removed from the top.

Example:

begin
  integer stackSize, top;
  stackSize := 10;
  top := 0;
  array stack[1:stackSize] of integer;

  procedure push(integer value);
  begin
    if top < stackSize then
    begin
      top := top + 1;
      stack[top] := value;
    end
    else
      print("Stack Overflow");
  end;

  procedure pop();
  begin
    if top > 0 then
    begin
      print(stack[top]);
      top := top - 1;
    end
    else
      print("Stack Underflow");
  end;

  push(10);
  push(20);
  pop();
  pop();
  pop();
end;

Queues

A queue is a FIFO (First In, First Out) data structure. Elements are added at the rear and removed from the front.

Example:

begin
  integer queueSize, front, rear;
  queueSize := 10;
  front := 1;
  rear := 0;
  array queue[1:queueSize] of integer;

  procedure enqueue(integer value);
  begin
    if rear < queueSize then
    begin
      rear := rear + 1;
      queue[rear] := value;
    end
    else
      print("Queue Full");
  end;

  procedure dequeue();
  begin
    if front <= rear then
    begin
      print(queue[front]);
      front := front + 1;
    end
    else
      print("Queue Empty");
  end;

  enqueue(10);
  enqueue(20);
  dequeue();
  dequeue();
  dequeue();
end;

Trees

A tree is a hierarchical data structure with a root node and child nodes. Each node can have multiple children.

Example:

begin
  integer node;
  record treeNode (integer value; ref treeNode left, right);
  ref treeNode root;

  root := new treeNode;
  root.value := 10;
  root.left := new treeNode;
  root.left.value := 5;
  root.right := new treeNode;
  root.right.value := 15;

  procedure inOrderTraversal(ref treeNode node);
  begin
    if node != nil then
    begin
      inOrderTraversal(node.left);
      print(node.value);
      inOrderTraversal(node.right);
    end;
  end;

  inOrderTraversal(root);
end;

Practical Exercises

Exercise 1: Implement a Doubly Linked List

Create a doubly linked list where each node points to both the next and the previous node.

Solution:

begin
  integer node;
  record nodeType (integer value; ref nodeType next, prev);
  ref nodeType head, tail, temp;

  head := new nodeType;
  head.value := 10;
  head.prev := nil;
  head.next := new nodeType;
  head.next.value := 20;
  head.next.prev := head;
  head.next.next := nil;
  tail := head.next;

  temp := head;
  while temp != nil do
  begin
    print(temp.value);
    temp := temp.next;
  end;
end;

Exercise 2: Implement a Circular Queue

Create a circular queue where the last position is connected back to the first position.

Solution:

begin
  integer queueSize, front, rear;
  queueSize := 5;
  front := 1;
  rear := 0;
  array queue[1:queueSize] of integer;

  procedure enqueue(integer value);
  begin
    if (rear + 1) mod queueSize != front then
    begin
      rear := (rear + 1) mod queueSize;
      queue[rear] := value;
    end
    else
      print("Queue Full");
  end;

  procedure dequeue();
  begin
    if front != (rear + 1) mod queueSize then
    begin
      print(queue[front]);
      front := (front + 1) mod queueSize;
    end
    else
      print("Queue Empty");
  end;

  enqueue(10);
  enqueue(20);
  dequeue();
  dequeue();
  dequeue();
end;

Summary

In this section, we covered the basics of dynamic data structures in ALGOL, including linked lists, stacks, queues, and trees. We also provided practical examples and exercises to help reinforce the concepts. Understanding dynamic data structures is crucial for writing efficient and flexible programs that can handle varying amounts of data. In the next module, we will delve into advanced topics such as file handling and memory management.

© Copyright 2024. All rights reserved