2.3.2. Algorithms For The Main Data Structures
2.3.2. Algorithms For The Main Data Structures
2.3.2. Algorithms For The Main Data Structures
www.pmt.education
Specification:
● Stacks
● Queues
www.pmt.education
Algorithms for the Main Data Structures
Algorithms and data structures go hand in hand. Each data structure has its own
algorithms associated with it, allowing the data to be manipulated in useful ways.
All of the data structures mentioned in these notes are covered in greater detail in the
notes for 1.4.2 Data Structures.
Stacks
Stacks are an example of a first in, last out (FILO) data structure. They are often
implemented as an array and use a single pointer which keeps track of the top of the stack
(called the top pointer). This points to the element which is currently at the top of the stack.
[2]
Top → 5 [1]
1 [0]
Algorithms for stacks include adding to the stack, removing from the stack and checking
whether the stack is empty/full. These have their own special names, as shown in the table
below.
Operation Name
www.pmt.education
size()
Size returns the number of elements on the stack. The pseudocode is as simple as
returning the value of the top pointer plus one (remember that the first element is in
position 0).
size()
return top + 1
isEmpty()
To check whether a stack is empty, we need to check whether the top pointer is less than
0. If it is, then the stack is empty, otherwise there is data in the stack
isEmpty()
if top < 0:
return True
else:
return False
endif
peek()
To return the item at the top of the stack, without removing it, simply return the item at the
position indicated by the top pointer. For these examples, we’ll assume our stack is an
array called A.
Don’t forget to check that the stack has data in it before attempting to return data though,
an empty stack could cause errors. It’s useful to use the isEmptyfunction here.
peek()
if isEmpty():
return error
else:
return A[top]
endif
push(element)
To add an item to a stack, the new item is passed as a parameter. Firstly, the top pointer is
updated. Then the new element can be inserted at the position of the top pointer.
push(element)
top += 1
A[top] = element
www.pmt.education
pop()
To remove an item from a stack, the element at the position of the top pointer is recorded
before being removed. Then the top pointer is decremented by one before the removed
item is returned. As with peek(), it’s important to check that the stack isn’t empty before
attempting a pop.
pop()
if isEmpty():
return error
else:
toRemove = A[top]
A[top] = “”
top -= 1
return toRemove
endif
Example
What would be the result of the following operations on a 3-element stack?
push(1)
push(5)
push(4)
peek()
pop()
isEmpty()
The first three operations pushthe items 1, 5 and 4 to the stack in that order.
→ 4
→ 5 5
→ 1 1 1
Next is pop
. This removes the item at the top of the stack and returns it, 4, before the top
pointer moves down one place.
www.pmt.education
→ 5
1
Finally isEmptyis carried out. The stack is not empty and so False is returned.
isEmptydoesn’t affect the appearance of a stack, meaning that the final state of the stack
is as shown above. The output from the operations is:
4, 4, False
Queues
Queues are a type of first in, first out (FIFO) data structure. Just like stacks, queues are
often represented as arrays. However, unlike stacks, queues make use of two pointers:
front and back. While front holds the position of the first element, back stores the next
available space.
Operations which can be carried out on queues are similar to those associated with
stacks, but be aware - some have different names.
↑ ↑
Front Back
Operation Name
www.pmt.education
size()
To work out the size of a queue, simply subtract the value of front from back. If front is at 0
and back is at 5, there are 5 elements in the queue.
size()
return back - front
isEmpty()
When a queue is empty, front and back point to the same position. To check whether a
queue is empty, just check whether the two pointers hold the same value.
isEmpty()
if front == back:
return True
else:
return False
peek()
Just like a stack, peek returns the element at the front of the queue without removing it.
peek()
return A[front]
enqueue(element)
To add an element to a queue, the element is placed in the position of back and then back
is incremented by one.
enqueue(element)
A[back] = element
back += 1
www.pmt.education
dequeue()
Items are removed from a queue from the position of the front pointer. Just like stacks, it’s
important to check that the queue isn’t empty before trying to dequeue an element.
dequeue()
if isEmpty():
return error
else:
toDequeue = A[front]
A[front] = “”
front += 1
return toDequeue
Example
A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7]
↑ ↑
Front Back
What would be the result of the following operations on the queue above?
dequeue()
enqueue(“Julia”)
size()
peek()
size()
dequeue()
isEmpty()
↑ ↑
Front Back
www.pmt.education
Next, Julia is enqueued. The name is added at the position of the back pointer and the
back pointer is moved to position 6.
↑ ↑
Front Back
Now we check the size of the queue. 6-1 = 5and so 5 is returned. The next operation is
peekwhich returns the item at the front of the queue, Rajiv but does not change the
queue otherwise.
The next operation is size , and because the queue hasn’t changed as a result of the
peek operation, 5 is returned again.
Next a dequeueis performed. Rajiv is returned, removed from the queue and the front
pointer moved to Sam.
↑ ↑
Front Back
Finally, the isEmptycommand is performed. Because the values of front and back are
not the same, False is returned.
www.pmt.education