Home
Introduction
Courses
Glossary
About

Intermediate - Stacks

In this course and the next two courses, we'll be going through two data structures in programming: Stacks and Queues. This course will be on stacks and its basic operations.

What is a stack?

There are many types of data structures which allow the storing of information, and a stack is one of them. A stack is a data structure that allows items to be added and removed from one end. That's why it's also described as a LIFO stack. Last In First Out. A stack can be directly compared to some real-life objects. For example, a stack of trays. Trays are only added and removed from the top. A stack of exercise books can also be used as another analogy. Students only take away or pass up exercise books from the top.

So what's the use of a stack?

While it may seem pretty useless to have a data structure that only accepts input and output from one end, you'll realize that certain applications would become easier to write when implementing stacks. For example, a calculator. Calculators are able to calculate calculations while following the rules of precedence by using stacks. Stacks are also used in your computer's allocation of memory. You see, even though the structure might seem quite rigid, stacks can actually be used in a great number of situations.

How are stacks implemented then?

Top -> 4 3 2 1

Okay, let's get a bit into the theory. A stack can be implemented using an array and a number indicating the top of the stack. There is a flaw, however, that the capacity of the stack is fixed and limited. However, we could use Linked Lists to implement it so that the stack dynamically expands its capacity.

There are five basic operations associated with a stack:

  • init_stack
    initializes an empty stack
  • empty_stack
    returns true if stack is empty
  • push
    inserts element onto top of stack
  • pop
    remove, and if necessary, return the top element of stack
  • top
    return, without removing, the top element of stack
By the way, the terms push and pop are used to describe the act of inserting or removing elements in a stack. To push is to insert an element. To pop is to remove an element. Note however, that these terms are only used in stacks.

Alright, let's start coding!

We'll start off first by declaring a constant, MAX, as the maximum height of the stack. This way, we can easily increase the maximum height as needed.

  const
    MAX = 20;
As mentioned before, each stack is made up of an array, and a number indicating its top. Since we want to make it modular, let's make our own type definition. (To learn more about user defined types, look up 'type' in the online help.)
  type
    int_Stack = record
                  int_array: array[0..MAX] of integer;
                  top: integer;
                end;
Now let's code all the five basic operations. The 'trick' is this: We identify that a stack is empty when top is equal to -1. That's why when we initialize it, we set top to become -1. Then when something is pushed, top increases to become 0. It's that simple!
  function is_empty(s: int_Stack) : boolean;
    begin
      is_empty := (s.top = -1);
    end;

  function is_full(s: int_Stack) : boolean;
    begin
      is_full := (s.top = MAX);
    end;

  function top(s: int_Stack) : integer;
    begin
      top := s.int_array[s.top];
    end;

  procedure push(var s: int_Stack; x: integer);
    begin
      if is_full(s) then
        Writeln('Stack Full')
      else
        begin
          s.top := s.top + 1;
          s.int_array[s.top] := x;
        end;
    end;

  function pop(var s: int_Stack) : integer;

    var
      t: integer;

    begin
      if is_empty(s) then
        Writeln('Stack Empty')
      else
        begin
          t := s.int_array[s.top];
          s.top := s.top - 1;
          pop := t;
        end;
    end;
Great! Now, with this library of commands, you can easily implement stacks into any program. But it doesn't end here. Go on to the next course to learn about Queues and how to implement them.

PreviousNextTop