Data Structures
Chapter II:
Data Structures
FAP:UC-BCF 1
Terminologies
Data Types:
Refer to the different kinds of data that a variable may hold in a
programming languages
Examples:
integer
real
float
char
string
FAP:UC-BCF 2
Terminologies
Data Objects:
Refer to the set of elements
Example: data object integer refers to
D = {0, ±1, ±2, ±3, … }
FAP:UC-BCF 3
Terminologies
Data Structures:
Describe the set of objects and how they are related.
Describe the set of operations that can be applied on the
elements of a data object.
Typically this describe the more complex data types such as
arrays, stacks, queues, trees, graphs and operations of how
to manipulate these.
FAP:UC-BCF 4
Records
A structure that can have a number of heterogeneous
elements.
Declaration: RecordType
typedef struct field1
{
field2
<data type1> field1;
<data type2> field2; field3
<data type3> field3; .
<data typeN> fieldN;
.
}RecordType;
fieldN
FAP:UC-BCF 5
Records
Field1, field2, field3 … fieldN can be of any data type (i.e. integer,
float, real, record)
To define a variable for the record:
RecordType A;
Assigning a value to a record field:
A.field1 = <value>;
A.field2 = <value>;
To retrieve a value from a record field:
printf(“%d”, A.field1);
printf(“%c”, A.field2);
printf(“%d:4:2”, A.field3);
FAP:UC-BCF 6
Arrays
Consecutive set of memory locations is a set of pairs –
index and a value finite, ordered set of homogeneous
elements.
Forms:
- one-dimensional array
- n-dimensional array
FAP:UC-BCF 7
Arrays
2 data types
Base type of component type
Index type
Declaration
int A[10]; char B[45];
2 basic operations
Extraction
Storing
FAP:UC-BCF 8
Arrays
If an array is declared to be A[n], then:
n = number of elements
If an array is declared to be A[n][m], then
n*m = number of elements
if given n-dimensional array declaration
A[b][c][d]…[n] = Πb,c, … n
FAP:UC-BCF 9
Arrays
To determine the ith element of a Single-dimension
array:
A[i] = α + (i) * esize
where:
α - base or starting address
i – element
esize – element size in bytes
Example: Determine the address of 5th element of an
integer array A with a starting address of 2000
FAP:UC-BCF 10
Arrays
To determine the ith element of a Two-
dimension array:
A[i][j] = α + [(i)*(UB2)+(j)] * esize
where:
UB2 – upper bound of the 2nd dimension
α - base or starting address
esize – element size in bytes
FAP:UC-BCF 11
Arrays
To determine the ith element of a Three-
dimension array:
A[i][j][k]= α +[(i)*(UB2)*(UB3)+(j)*(UB3)+(k)]*esize
where:
UB3 – upper bound of the 3rd dimension
UB2 – upper bound of the 2nd dimension
α - base or starting address
esize – element size in bytes
FAP:UC-BCF 12
Arrays
Exercises:
1. Given A[10][3][3][6], α =2000, esize=4 bytes:
a.find the formula to represent an element in a 4-
dimensional array.
b.find the total number of elements
c. find the address of A[2][2][0][4]
2. Given X[8][3][6][2][3], α =3000, esize=3 bytes:
a.find the total number of elements
b.find the address of X[0][2][5][1][2]
FAP:UC-BCF 13
Arrays
3. Consider the following declaration:
typedef struct{
int A;
char B[10];
float C;
char D;
}rectype;
typedef rectype matrix[121][4][5];
matrix A1;
a. compute the address of element A1[120][3][3] given the
base address at 2000.
b. Assume that we do not know the size of RECTYPE in
number of bytes but we know that the address of
A1[20][2][3] is 2160. Give the size of RECTYPE in
bytes. Assume the base address is at 2000.
FAP:UC-BCF 14
Stacks
An ordered list in which all insertions and deletions are
made at one end called the TOP.
LIFO (Last In First Out)
G
A B C D E F
TOP
A B C D E F G
TOP
FAP:UC-BCF 15
Stacks
Operations:
Create(top) – Create an empty stack
Push(Stack, top, item) – Inserts an element item into the stack
Pop(Stack, top, item) – Removes the top element of the stack
and stores the value in item
S_top(Stack, top) – Returns the top element of the stack
Empty(top) – Determines whether the stack is empty or not.
Stack full: Top = n-1
Stack empty: Top = -1
FAP:UC-BCF 16
Stacks
Representation:
One-dimensional array
A B C D E F
TOP
Singly linked-list
A B C D
TOP
FAP:UC-BCF 17
Stacks
Declaration
#define n <constant value>
typedef <data type> elementtype;
typedef elementtype Stack[n];
Example:
Processing of procedure calls and their terminations
FAP:UC-BCF 18
Stacks
Procedures for Stack Operations:
void create(int *top)
{*top = -1;}
void push(stack S; int *top;elementtype item)
{
if(top==n-1)
stackfull;
else {
*top++;
S[*top] = item;
}
}
FAP:UC-BCF 19
Stacks
void pop(stack S; int *top; elementtype *item)
{ if(top==1) stackempty;
else{ *item = S[top];
*top--;}
}
elementtype s_top(stack S; int top)
{ if(top==-1) error_routine;
else return S[top];
}
int empty(int top)
{ if(top == 1) return 1;
else return 0;
}
FAP:UC-BCF 20
Stacks
void main()
{ create(&top1); create(&top2);
s_empty = empty(top1);
printf(“%d”, s_empty);
push(s1, &top1, 16);
s_empty = empty(top1);
printf(“%d”, s_empty);
push(s1, &top1, 10); push(s1, &top1, 9);
push(s1, &top1, 8); push(s1, &top1, 7);
j=s_top(s1, top1);
printf(“Top is %d”, j);
printf(“%d\n”, top1);
FAP:UC-BCF 21
Stacks
s_empty = empty(top2);
printf(“%d”, s_empty);
push(s2, &top2, 10); push(s2, &top2, 9);
push(s2, &top2, 8); push(s2, &top2, 7);
push(s2, &top2, 12); push(s2, &top2, 4);
pop(s1, &top1, &item);
pop(s2, &top2, &item);
j=s_top(s2, top2); printf(“Top is %d”, j);
printf(“%d\n”, top2);
}
FAP:UC-BCF 22
Evaluation of Expressions
Expression is made up of operands, operators and
delimiters.
Operands can be any legal variable names or constants
in programming languages.
Operations are described by operators:
Basic arithmetic operators: + - * /
Unary operators: - +
Relational operators: ==, >, <, >=, <=
FAP:UC-BCF 23
Evaluation of Expressions
Our concern: how the expressions are evaluated
The compiler accepts expressions and produce correct result by
reworking the expressions into postfix form. Other forms include
infix and prefix.
Prefix : <Operator> <Operand1> <Operand2>
Postfix : <Operand1> <Operand2> <Operator>
Infix : <Operand1> <Operator> <Operand2>
FAP:UC-BCF 24
Evaluation of Expressions
Expression: A + B
Prefix : +AB
Postfix: AB+
Expression: (A+B*C)/D
Prefix : /+A*BCD
Postfix: ABC*+D/
FAP:UC-BCF 25
Conversion from Infix to Postfix
using Stacks
IN-Stack Priority (ISP) – The priority of the operator as
an element of the stack.
IN-Coming Priority (ICP) – The priority of the operator
as current token.
SYMBOL ISP ICP
) -- --
^ 3 4
*, / 2 2
+,- 1 1
( 0 4
FAP:UC-BCF 26
Conversion from Infix to Postfix
using Stacks
Rule:
Operators are taken out of the stack (POP) as long as
their ISP is greater than or equal to the ICP of the new
operator.
Note: ISP and ICP of # sign = -1
FAP:UC-BCF 27
Conversion from Infix to Postfix
using Stacks
Algorithm:
void POSTFIX(expression E)
token x,y;
stack[0] = ‘#’; top = 0;
x = nexttoken(E); //takes the first token and remove it
from the original expression.
while x != ‘#’
{ if x is an operand printf(x);
else if x ==‘)’ {//unstack until ‘(’
while stack[top] != ‘(’
{ pop(y); printf(y);}
pop(y); //delete ‘(’
FAP:UC-BCF } 28
Conversion from Infix to Postfix
using Stacks
else{ while isp[stack[top]] >= icp[x]
{ pop(y); printf(y); }
push(x);
}
x = nexttoken(E);
}
if(!empty(stack))
{ while stack[top] != ‘#’
{ pop(y);
printf(y);
}
}
FAP:UC-BCF 29
Conversion from Infix to Postfix
using Stacks
Algorithm:
Do steps 1-3 while x is not #, else do step 4
1. Get the token from E and save it as X
2. If X is an operand, immediately print in the output
else check if X == ‘)’ pop operators in the stack and print in the output.
delete ‘)’
else while ISP of top of stack (Y) >= ICP of X,
Pop and print in the output.
Push X
3. Process the next token
4. If stack is not empty, pop and print until not #.
FAP:UC-BCF 30
Queues
An ordered list which all insertions take place at one
end, called the REAR, while all deletions take place at
the other end, called the FRONT.
FIFO (First-In-First-Out)
Elements are processed in the same order as they were
received. The first element inserted in the queue will be
the first one to be removed.
FAP:UC-BCF 31
Queues
Conventions for FRONT and REAR:
Front is always 1 less than the actual front of the queue.
Rear always points to the last element in the queue.
Initial value: Front = Rear = -1
Operations:
Createq(Front, Rear) – creates an empty queue
Insert(Queue, Rear, Item) – inserts the element item to the rear
of the queue.
Delete(Queue, Front, Rear, Item) – removes the front element
from the queue and assigns is to variable item.
Qfront(Queue, Front, Rear) – returns the front element of the
queue
FAP:UC-BCF 32
Queues
Qempty(Front, Rear) – determines if the queue is empty or not
Returns 1 if true
Otherwise return 0
Front = Rear means queue is empty.
FAP:UC-BCF 33
Queues
Representation
One-dimensional Array
A B C D E F G
Front Rear
Singly linked-list
A B C D
Rear Front
FAP:UC-BCF 34
Queues
Declaration:
#define n <constant value>
typedef <data type> elementtype;
typedef elementtype Queue[n];
typedef int FR
FR front, rear;
Queue Q;
FAP:UC-BCF 35
Queues
Example:
Processing of customers’ transactions (i.e. cashiers, bank-related)
Procedures for Queue Operations:
void createq(FR *front, FR *rear)
{ *front = *rear = -1 }
void insert(queue Q, FR *rear, elementtype item)
{ if(rear == n-1) queuefull;
else { (*rear)++;
Q[*rear] = item; }
}
FAP:UC-BCF 36
Queues
void delete(queue Q, FR *front, FR *rear, elementtype
*item)
{ if(*front == rear) queueempty;
else { (*front)++;
item = Q[front];}
}
elementtype qfront(queue Q, FR front, FR rear)
{ if(front == rear) errorroutine;
else return(Q[front + 1])
}
int quempty()
{ if(front == rear) return 1;
else return 0;
}
FAP:UC-BCF 37
Queues
Notes:
QUEUEFULL signal does not necessary imply that
there are N elements in the queue.
To solve this, move the entire queue to the left so that
the first element is again at Q[0] and front = -1.
FAP:UC-BCF 38
Circular Queues
.. n-1
.. 0
4 1
3 2
FAP:UC-BCF 39
Circular Queues
void insert(queue *Q, FR front, FR *rear, elementtype
item)
{ if(front == (rear+1)%n) queuefull;
else { *rear = (*rear+1)%n;
Q[*rear] = item;}
}
void delete(queue Q, FR *front, FR rear, elementtype
*item)
{ if(front == rear) then cqueueempty;
else { *front = (*front+1)%n;
*item = Q[front]; }
}
FAP:UC-BCF 40
Circular Queues
elementtype cqfront(queue Q, FR front, FR rear)
{ if(front == rear) errorrouting;
else return(Q[front+1]%n);
}
int cquempty()
{ if(front == rear) return 1;
else return 0;
}
FAP:UC-BCF 41
Exercises
Convert the following infix expressions to postfix and
prefix:
1. A+B*C/D
2. A/B^C+D*E-A*C
3. (A+B)*D+E/(F+A*D)+C
4. A+B*D^E^F^G/H^J*K-L
5. !(A&&!(B<C)||(C>D))||(C<E)
FAP:UC-BCF 42
Exercises
Convert the following prefix expressions to infix:
6. -+-^ABC*D^EFG
7. ^+-ABC+D-EF
8. || || &&ABC!<=EF
Convert the following postfix expressions to infix:
9. AB+CDE-F+*G-/
10. AB-C+DEF-+^
11. AB&&C||EF<=!||
FAP:UC-BCF 43
Exercises
Convert the following infix expressions to postfix
using stack:
12. B+C^(E+F*G^H)/(K-L/M)+N
13. B+C/D^(E+F*G^H)+Z
14. A+B-C*D*(E+F-G*H^I^J)+L/M+(N*O/P+
(Q^R^S^T))+U
FAP:UC-BCF 44