0% found this document useful (0 votes)
6 views39 pages

Chapter 12

This document covers the concept of Abstract Data Types (ADTs), defining various types such as stacks, queues, general trees, binary trees, binary search trees, and graphs, along with their operations and applications. It emphasizes the importance of encapsulation and provides insights into the implementation of these data structures using arrays or linked lists. Additionally, it discusses the operations associated with each data type and their practical applications in programming and computer science.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
6 views39 pages

Chapter 12

This document covers the concept of Abstract Data Types (ADTs), defining various types such as stacks, queues, general trees, binary trees, binary search trees, and graphs, along with their operations and applications. It emphasizes the importance of encapsulation and provides insights into the implementation of these data structures using arrays or linked lists. Additionally, it discusses the operations associated with each data type and their practical applications in programming and computer science.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 39

3/4/2022

CHAPTER 12
Abstract Data Type

q Define the concept of an abstract data type (ADT).

q Define a stack, the basic operations on stacks, their applications, and how
they can be implemented.

q Define a queue, the basic operations on queues, their applications, and how
they can be implemented.

q Define a general tree and its application.

q Define a general linear list, the basic operations on lists, their application
and how they can be implemented.

q Define a binary tree—a special kind of tree—and its applications.

q Define a binary search tree (BST) and its applications.

q Define a graph and its applications.

1
3/4/2022

12.1.1 Simple ADTs


Many programming languages already define some simple
ADTs as integral parts of the language. For example, the C
language defines a simple ADT called an integer. The type of
this ADT is integer with predefined ranges. C also defines
several operation that can be applied on this data type
(addition, subtraction, multiplication, division, and so on). C
explicitly defines these operations on integers and what we
expect as the results. A programmer who writes a C program
to add two integers should know about the integer ADT and
the operations that can be applied to it.

2
3/4/2022

12.1.2 Complex ADTs


Although several simple ADTs, such as integer, real,
character, pointer, and so on, have been implemented and are
available for use in most language, many useful complex
ADTs are not. As we will see in this chapter, we need a list
ADT, a stack ADT, a queue ADT, and so on. To be efficient,
these ADTs should be created and stored in the library of the
computer to be used.

The concept of abstraction means:


1. We know what a data type can do.
2. How it is done is hidden.

12.1.3 Definition
Let us now define an ADT. An abstract data type is a data
type packaged with the operations that are meaningful for
the data type. We then encapsulate the data and the
operations on the data and hide them from the user.

Abstract data type:


1. Definition of data
2. Definition of operations
3. Encapsulation of data and operation

3
3/4/2022

12.1.4 Model for an abstract data type


The ADT model is shown in Figure 12.1. Inside the ADT are
two different parts of the model: data structure and
operations (public and private).
Figure 12.1 The model for an ADT

12.1.5 Implementation
Computer languages do not provide complex ADT packages.
To create a complex ADT, it is first implemented and kept in
a library. The main purpose of this chapter is to introduce
some common user-defined ADTs and their applications.
However, we also give a brief discussion of each ADT
implementation for the interested reader. We leave the
pseudocode algorithms of the implementations as
challenging exercises.

4
3/4/2022

Figure 12.2 Three representations of stacks

12.2.1 Operations on stacks


There are four basic operations, stack, push, pop, and empty,
that we define in this chapter.

The stack operation


The stack operation creates an empty stack. The following
shows the format.

Figure 12.3 Stack operation

5
3/4/2022

The push operation


The push operation inserts an item at the top of the stack.
The following shows the format.

Figure 12.4 Push operation

The pop operation


The pop operation deletes the item at the top of the stack.
The following shows the format.

Figure 12.5 Pop operation

6
3/4/2022

The empty operation


The empty operation checks the status of the stack. The
following shows the format.

This operation returns true if the stack is empty and false if


the stack is not empty.

12.2.2 Stack ADT


We define a stack as an ADT as shown below:

7
3/4/2022

Example 12.1

Figure 12.6 Example 12.1

12.2.3 Stack applications


Stack applications can be classified into four broad
categories: reversing data, pairing data, postponing data
usage, and backtracking steps. We discuss the first two in
the sections that follow.

Reversing data items


Reversing data items requires that a given set of data items
be reordered so that the first and last items are exchanged,
with all of the positions between the first and last being
relatively exchanged also. For example, the list (2, 4, 7, 1, 6,
8) becomes (8, 6, 1, 7, 4, 2).

8
3/4/2022

Example 12.2

9
3/4/2022

Pairing data items


We often need to pair some characters in an expression. For
example, when we write a mathematical expression in a
computer language, we often need to use parentheses to
change the precedence of operators. The following two
expressions are evaluated differently because of the
parentheses in the second expression:

When we type an expression with a lot of parentheses, we


often forget to pair the parentheses. One of the duties of a
compiler is to do the checking for us. The compiler uses a
stack to check that all opening parentheses are paired with a
closing parentheses.

10
3/4/2022

Example 12.3

11
3/4/2022

12.2.4 Stack implementation


At the ADT level, we use the stack and its four operations; at
the implementation level, we need to choose a data structure
to implement it. Stack ADTs can be implemented using
either an array or a linked list. Figure 12.7 shows an example
of a stack ADT with five items. The figure also shows how
we can implement the stack.
In our array implementation, we have a record that has
two fields. The first field can be used to store information
about the array. The linked list implementation is similar: we
have an extra node that has the name of the stack. This node
also has two fields: a counter and a pointer that points to the
top element.

Figure 12.7 Stack implementations

12
3/4/2022

Figure 12.8 Two representation of queues

12.3.1 Operations on queues


Although we can define many operations for a queue, four
are basic: queue, enqueue, dequeue, and empty, as defined
below.
The queue operation
The queue operation creates an empty queue. The following
shows the format.

Figure 12.9 The queue operation

13
3/4/2022

The enqueue operation


The enqueue operation inserts an item at the rear of the
queue. The following
shows the format.

Figure 12.10 The enqueue operation

The dequeue operation


The dequeue operation deletes the item at the front of the
queue. The following shows the format.

Figure 12.11 The dequeue operation

14
3/4/2022

The empty operation


The empty operation checks the status of the queue. The
following shows the format.

This operation returns true if the queue is empty and false if


the queue is not empty.

12.3.2 Queue ADT


We define a queue as an ADT as shown below:

15
3/4/2022

Example 12.4

Figure 12.12 Example 12.4

12.3.3 Queue applications


Queues are one of the most common of all data processing
structures. They are found in virtually every operating
system and network and in countless other areas. For
example, queues are used in online business applications
such as processing customer requests, jobs, and orders. In a
computer system, a queue is needed to process jobs and for
system services such as print spools.

12.32

16
3/4/2022

Example 12.5

17
3/4/2022

Example 12.6

18
3/4/2022

12.3.4 Queue implementation


At the ADT level, we use the queue and its four operations at
the implementation level, we need to choose a data structure
to implement it. A queue ADT can be implemented using
either an array or a linked list. Figure 12.13 on page 329
shows an example of a queue ADT with five items. The
figure also shows how we can implement it. In the array
implementation we have a record with three fields. The first
field can be used to store information about the queue.

The linked list implementation is similar: we have an


extra node that has the name of the queue. This node also has
three fields: a count, a pointer that points to the front
element, and a pointer that points to the rear element.

Figure 12.13 Queue implementation

19
3/4/2022

Figure 12.14 General linear list

12.4.1 Operations on general linear lists


Although we can define many operations on a general linear
list, we discuss only six common operations in this chapter:
list, insert, delete, retrieve, traverse, and empty.
The list operation
The list operation creates an empty list. The following shows
the format:

20
3/4/2022

The insert operation


Since we assume that data in a general linear list is sorted,
insertion must be done in such a way that the ordering of the
elements is maintained. To determine where the element is to
be placed, searching is needed. However, searching is done
at the implementation level, not at the ADT level.

Figure 12.15 The insert operation

The delete operation


Deletion from a general list (Figure 12.16) also requires that
the list be searched to locate the data to be deleted. After the
location of the data is found, deletion can be done. The
following shows the format:

Figure 12.16 The delete operation

21
3/4/2022

The retrieve operation


By retrieval, we mean access of a single element. Like
insertion and deletion, the general list should be first
searched, and if the data is found, it can be retrieved. The
format of the retrieve operation is:

Figure 12.17 The retrieve operation

The traverse operation


Each of the previous operations involves a single element in
the list, randomly accessing the list. List traversal, on the
other hand, involves sequential access. It is an operation in
which all elements in the list are processed one by one. The
following shows the format:

The empty operation


The empty operation checks the status of the list. The
following shows the format:

22
3/4/2022

The empty operation


The empty operation checks the status of the list. The
following shows the format:

This operation returns true if the list is empty, or false if the


list is not empty.

12.4.2 General linear list ADT


We define a general linear list as an ADT as shown below:

23
3/4/2022

Example 12.7

Figure 12. 18 Example 12.7

12.4.3 General linear list applications


General linear lists are used in situations in which the
elements are accessed randomly or sequentially. For
example, in a college a linear list can be used to store
information about students who are enrolled in each
semester.

24
3/4/2022

Example 12.8

25
3/4/2022

Example 12.9

26
3/4/2022

12.4.4 General linear list implementation


At the ADT level, we use the list and its six operations but at
the implementation level we need to choose a data structure
to implement it. A general list ADT can be implemented
using either an array or a linked list. Figure 12.19 shows an
example of a list ADT with five items. The figure also shows
how we can implement it.

Figure 12.19 General linear list implementation

27
3/4/2022

Algorithm
We can write six algorithms in pseudocode for the six
operations we defined for a list in each implementation. We
showed algorithms to handle arrays and linked lists in
Chapter 11: these algorithms can be slightly modified to
create the algorithms we need for a list. We leave these as an
exercise.

Figure 12.20 Tree representation

28
3/4/2022

We can divided the vertices in a tree into three categories:


the root, leaves, and the internal nodes. Table 12.1 shows
the number of outgoing and incoming arcs allowed for each
type of node.

Each node in a tree may have a subtree. The subtree of each


node includes one of its children and all descendents of that
child. Figure 12.21 shows all subtrees for the tree in Figure
12.20.

Figure 12.21 Subtrees

29
3/4/2022

Figure 12.22 A binary tree

Recursive definition of binary trees


In Chapter 8 we introduced the recursive definition of an
algorithm. We can also define a structure or an ADT
recursively. The following gives the recursive definition of a
binary tree. Note that, based on this definition, a binary tree
can have a root, but each subtree can also have a root.

30
3/4/2022

Figure 12.23 shows eight trees, the first of which is an empty


binary tree (sometimes called a null binary tree).

Figure 12.23 Examples of binary trees

12.5.2 Operations on binary trees


The six most common operations defined for a binary tree
are tree (creates an empty tree), insert, delete, retrieve,
empty and traversal. The first five are complex and beyond
the scope of this book. We discuss binary tree traversal in
this section.

31
3/4/2022

Binary tree traversals


A binary tree traversal requires that each node of the tree be
processed once and only once in a predetermined sequence.
The two general approaches to the traversal sequence are
depth-first and breadth-first traversal.

Figure 12.24 Depth-first traversal of a binary tree

Example 12.10

Figure 12.25 Example 12.10

32
3/4/2022

Example 12.11

Figure 12.26 Example 12.11

12.5.3 Binary tree applications


Binary trees have many applications in computer science. In
this section we mention only two of them: Huffman coding
and expression trees.

Huffman coding
Huffman coding is a compression technique that uses binary
trees to generate a variable length binary code from a string
of symbols. We discuss Huffman coding in detail in Chapter
15.

33
3/4/2022

Expression trees
An arithmetic expression can be represented in three
different formats: infix, postfix, and prefix. In an infix
notation, the operator comes between the two operands. In
postfix notation, the operator comes after its two operands,
and in prefix notation it comes before the two operands.
These formats are shown below for addition of two operands
A and B.

Figure 12.27 Expression tree

34
3/4/2022

Figure 12.28 Binary search tree (BST)

35
3/4/2022

Example 12.12

Figure 12.29 Example 12.12

A very interesting property of a BST is that if we apply the


inorder traversal of a binary tree, the elements that are
visited are sorted in ascending order. For example, the three
BSTs in Figure 12.29, when traversed in order, gives the list
(3, 6, 17), (17, 19), and (3, 6, 14, 17, 19).

An inorder traversal of a BST creates a list that is


sorted in ascending order.

36
3/4/2022

Another feature that makes a BST interesting is that we can


use a version of the binary search we used in Chapter 8 for a
binary search tree. Figure 12.30 shows the UML for a BST
search.

Figure 12.30 Inorder traversal of a binary search tree

Binary search tree ADTs


The ADT for a binary search tree is similar to the one we
defined for a general linear list with the same operation. As a
matter of fact, we see more BST lists than general linear lists
today. The reason is that searching a BST is more efficient
that searching a linear list: a general linear list uses
sequential searching, but BSTs use a version of binary
search.

37
3/4/2022

BST implementation
BSTs can be implemented using either arrays or linked lists.
However, linked list structures are more common and more
efficient. The implementation uses nodes with two pointers,
left and right.

Figure 12.31 A BST implementation

38
3/4/2022

Figure 12.32 Graphs

Example 12.13

Example 12.14

39

You might also like