CS 202 Fall 2013  >  Notes for Tuesday, November 26, 2013

CS 202 Fall 2013
Notes for Tuesday, November 26, 2013

Stacks [18.1–18.2]

The Stack ADT

An abstract data type (ADT) is:

Today we discuss the ADT Stack. A stack is a sequence that can be modified at one end, called the top. We usually think of a Stack vertically. A common metaphor is a stack of plates: we can put a new plate on the top, and we can remove the top plate, but we cannot do anything with any plate other than the top one.

Here is a more formal description of ADT Stack.

Data
A sequence of items (generally all of the same type). One end of the sequence is the top.
Operations
  • Push. Add a new item to the top.
  • Pop. Remove the top item.
  • Top. Look at the top item.
  • Empty. Return whether there are any items.

Because the item we pop will always be the most recent one pushed, a Stack is also called a Last-In-First-Out (LIFO) structure.

Applications of Stacks

Program Execution

An important part of the execution of a program is the call stack. Each time a function is called, a stack frame for the function is pushed on the call stack. The stack frame contains parameters, other (non-static) local variables, and the function’s return address, which tells where to return to when the function finishes.

A function’s stack frame remains on the stack until it returns; at that point, the frame is popped. If function A calls function B, then the stack frame for function A remains on the stack, a frame for function B is pushed, and then popped when B returns, leaving the frame for function A on the top again.

Expression Evaluation

Suppose we are computing \((3+8)\times(4+9)\). We find that \(3+8=11\). Now we need to compute \(4+9\). We need a place to save that \(11\) while we perform this next computation. A Stack is the ideal structure for this. Push the \(11\). Compute \(4+9=13\). Then pop the \(11\) and compute \(11+13=24\).

In a more complex expression, we may have several values on the Stack at once. When we retrieve a saved value, the one on top will always be the one we need.

Shortly we will have more to say about Stacks and expression evaluation.

The STL Stack

The C++ Standard Library contains a Stack. It is a class template called stack, defined in the standard header <stack>. This works much like vector: a template parameter specifies the type of each item in the Stack. Member functions performing the four Stack operations are push, pop, top, and empty.

If the stack is not const, then member function top allows alteration of the top value.

[C++]

stack<int> s;
s.push(4);                // Now top is 4
cout << s.top() << endl;  // Prints 4
s.top() = 33;             // Now top is 33

Note that member function pop does not return a value. Thus, looking at the top and removing it are separate operations.

[C++]

int t = s.top();
s.pop()

Reverse Polish Notation

Suppose we are given a list containing numbers (like 32) and binary arithmetic operators (like +). We have a Stack, which holds numbers. We process the list item by item as follows.

Interpreting a list in this way gives us Reverse Polish Notation (RPN), or postfix notation. (This is a reversal of a notation invented a century ago by Polish mathematician Jan Łukasiewicz.) For example “\(5\;\;3\;\;{+}\)” is RPN for the expression we usually write as “\(5+3\)”. Our usual notation for arithmetic expressions is infix notation.

This gives us a way to write and evaluate arithmetic expressions.

Infix RPN / Postfix
 \(62\)   \(62\) 
 \(5+3\)   \(5\;\;3\;\;{+}\) 
 \(18-2\)   \(18\;\;2\;\;{-}\) 
 \((5+3)*(18-2)\)   \(5\;\;3\;\;{+}\;\;18\;\;2\;\;{-}\;\;{*}\) 
 \((2+3)*5\)   \(2\;\;3\;\;{+}\;\;5\;\;{*}\) 
 \(2+(3*5)\)   \(2\;\;3\;\;5\;\;{*}\;\;{+}\) 

Note that with RPN we never need parentheses; precedence and associativity are irrelevant.

For today’s lab work, see the 11/26 Challenge.


CS 202 Fall 2013: Notes for Tuesday, November 26, 2013 / Updated: 26 Nov 2013 / Glenn G. Chappell