+ All Categories
Home > Documents > Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item,...

Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item,...

Date post: 06-Feb-2018
Category:
Upload: tranduong
View: 225 times
Download: 1 times
Share this document with a friend
28
Chapter 4 LINKED STACKS AND QUEUES 1. Pointers and Linked Structures 2. Linked Stacks 3. Linked Stacks with Safeguards 4. Linked Queues 5. Application: Polynomial Arithmetic 6. Abstract Data Types and Implementations Outline Data Structures and Program Design In C++ Transp. 1, Chapter 4, Linked Stacks and Queues 52 1999 Prentice-Hall, Inc., Upper Saddle River, N.J. 07458
Transcript
Page 1: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

Chapter 4

LINKED STACKS ANDQUEUES

1. Pointers and Linked Structures

2. Linked Stacks

3. Linked Stacks with Safeguards

4. Linked Queues

5. Application: Polynomial Arithmetic

6. Abstract Data Types and Implementations

Outline Data Structures and Program Design In C++Transp. 1, Chapter 4, Linked Stacks and Queues 52 1999 Prentice-Hall, Inc., Upper Saddle River, N.J. 07458

Page 2: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

Pointers and a Linked List

Lynn

Jack

Dave

Marsha

r

s

t

u

v

Fred Jackie

Carol Tom René

367-2205

Jan. 28

295-0603Feb. 18

628-5100Feb. 23

286-2139Feb. 28

342-5153Mar. 15

Pointers and a Linked List Data Structures and Program Design In C++Transp. 2, Sect. 4.1, Pointers and Linked Structures 53 1999 Prentice-Hall, Inc., Upper Saddle River, N.J. 07458

Page 3: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

Key Terms

Overflow:

Running out of space.

Pointer:

An object, often a variable, that stores the location (that is themachine address) of some other object, typically of a structurecontaining data that we wish to manipulate. (Also sometimescalled a link or a reference)

Linked list:

A list in which each entry contains a pointer giving the loca-tion of the next entry.

Contiguous:

Next to each other, touching, adjoining; used in contrast tolinked.

Automatic object:

An object that exists as long as the block of program declaringit is active; referenced by giving it a name when writing theprogram.

Dynamic object:

An object that is created (and perhaps destroyed) while theprogram is running; accessed indirectly via pointers.

Key Terms Data Structures and Program Design In C++Transp. 3, Sect. 4.1, Pointers and Linked Structures 54 1999 Prentice-Hall, Inc., Upper Saddle River, N.J. 07458

Page 4: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

Pointers in C++

Notation:

C++ uses an asterisk * to denote a pointer. If Item is a type,then a pointer to such an Item object has the type Item *. Forexample,

Item *item ptr;

declares item ptr as a pointer variable to an Item object.

Creating dynamic objects:

item ptr = new Item; creates a new dynamic object of type Itemand assigns its location to the pointer variable item ptr.

The dynamic objects that we create are kept in an area ofcomputer memory called the free store (or the heap).

Deleting dynamic objects:

delete item ptr; disposes of the dynamic object to which item ptrpoints and returns the space it occupies to the free store so itcan be used again.

After this delete statement is executed, the pointer vari-able item ptr is undefined and so should not be used until it isassigned a new value.

Following pointers:

*item ptr denotes the object to which item ptr points. The ac-tion of taking *item ptr is called “dereferencing the pointer*item ptr.”

Pointers in C++ Data Structures and Program Design In C++Transp. 4, Sect. 4.1, Pointers and Linked Structures 55 1999 Prentice-Hall, Inc., Upper Saddle River, N.J. 07458

Page 5: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

NULL pointers:

If a pointer variable item ptr has no dynamic object to which itcurrently refers, then it should be given the special value

item ptr = NULL;

In diagrams we reserve the electrical ground symbol

for NULL pointers.The value NULL is used as a constant for all pointer types

and is generic in that the same value can be assigned to avariable of any pointer type.

Undefined pointers versus NULL pointers:

item ptr == NULL means that item ptr currently points to no dy-namic object. If the value of item ptr is undefined, then item ptrmight point to any random location in memory.

Programming PreceptUninitialized or random pointer objects should always be reset to NULL.

After deletion, a pointer object should be reset to NULL.

NULL pointers Data Structures and Program Design In C++Transp. 5, Sect. 4.1, Pointers and Linked Structures 56 1999 Prentice-Hall, Inc., Upper Saddle River, N.J. 07458

Page 6: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

196884

0

important_data

important_data

0 *random_pointer = 0;

*p = 0;

p

random_pointer

random_pointer

p

???

1378

1378??

p = NULL;

p = new Item;

*p = 1378;

delete p;

Pointer manipulations Data Structures and Program Design In C++Transp. 6, Sect. 4.1, Pointers and Linked Structures 57 1999 Prentice-Hall, Inc., Upper Saddle River, N.J. 07458

Page 7: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

Dynamically Allocated Arrays

The declaration item array = new Item[array size]; creates a dynam-ic array of Item objects, indexed from 0 up to array size − 1.

Consider, for example:

int size, *dynamic array, i;cout << "Enter an array size: " << flush;cin >> size;dynamic array = new int[size];for (i = 0; i < size; i++) dynamic array[i] = i;

The result is illustrated as:

dynamic_array

0 1 2 3 4 5 6 7 8 9 10

for (i=0; i<size; i++) dynamic_array[i ] = i;

dynamic_array = new int [size];

dynamic_array

The statement delete []dynamic array; returns the storage in dy-namic array to the free store.

If i is an integer value and p is a pointer to an Item, then p + i isan expression of type Item *. The value of p + i gives the memoryaddress offset from p by i Item objects. That is, the expression p + iactually yields the address p + n × i, where n is the number ofbytes of storage occupied by a simple object of type Item.

Dynamically Allocated Arrays Data Structures and Program Design In C++Transp. 7, Sect. 4.1, Pointers and Linked Structures 58 1999 Prentice-Hall, Inc., Upper Saddle River, N.J. 07458

Page 8: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

Music

Calculus

Calculus

Calculus

Music

Calculus

p

p *p

p

q

q *q

p = q

q *q = *p

*p = *q

*p

*q

Assign

men

tof

pointer

variablesD

ataS

tructu

resan

dP

rogramD

esignIn

C+

+T

ransp.8,S

ect.4.1,Poin

tersan

dL

inked

Stru

ctures

59

1999P

rentice-H

all,Inc.,U

pperS

addleR

iver,N.J.07458

Page 9: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

Addresses of automatic objects:

If x is a variable of type Item, then &x is a value of type Item

* that gives the address of x. In this case, a declaration andassignment such as Item *ptr = &x would establish a pointer,ptr, to the object x.

Address of an array:

The address of the initial element of an array is found byusing the array’s name without any attached [] operators.For example, given a declaration Item x[20] the assignment

Item *ptr = x

sets up a pointer ptr to the initial element of the array x.Observe that an assignment expression ptr = &(x[0]) could

also be used to find this address.

Pointers to structures:

If p is a pointer to a structure object that has a data membercalled the data, then we could access this data member with theexpression (*p).the data, but C++ provides the operator -> asa shorthand, so we can replace the expression (*p).the data bythe equivalent, but more convenient, expression p->the data.

C++ pointer operators Data Structures and Program Design In C++Transp. 9, Sect. 4.1, Pointers and Linked Structures 60 1999 Prentice-Hall, Inc., Upper Saddle River, N.J. 07458

Page 10: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

The Basics of Linked Structures

A linked structure is made up of nodes, each containing both theinformation that is to be stored as an entry of the structure anda pointer telling where to find the next node in the structure.We shall refer to these nodes making up a linked structure asthe nodes of the structure, and the pointers we often call links.Since the link in each node tells where to find the next node of thestructure, we shall use the name next to designate this link.

We shall use a struct rather than a class to implement nodes.

struct Node {// data members

Node entry entry;Node *next;

// constructorsNode( );Node(Node entry item, Node *add on = NULL);

};

Node *nextNode_entry entry

Node

(a) Structure of a Node (b) Machine storage representation of a Node

Node *next

Node_entryentryNode

Storage area reserved

by machineused to contain

Node_entry entryinformation

Pointer

The Basics of Linked Structures Data Structures and Program Design In C++Transp. 10, Sect. 4.1, Pointers and Linked Structures 61 1999 Prentice-Hall, Inc., Upper Saddle River, N.J. 07458

Page 11: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

Node Constructors

First form:Node :: Node( ){

next = NULL;}

The second form accepts two parameters for initializing the datamembers.Node :: Node(Node entry item, Node *add on){

entry = item;next = add on;

}

Example:

Node first node(′a′); // Node first node stores data ′a′.Node *p0 = &first node; // p0 points to first Node.Node *p1 = new Node(′b′); // A second node storing ′b′ is created.p0->next = p1; // The second Node is linked after first node.Node *p2 = new Node(′c′, p0); // A third Node storing ′c′ is created.

// The third Node links back to the first node, *p0.p1->next = p2; // The third Node is linked after the second Node.

'a' 'b' 'c'p0

p1 p2

first_node

Node Constructors Data Structures and Program Design In C++Transp. 11, Sect. 4.1, Pointers and Linked Structures 62 1999 Prentice-Hall, Inc., Upper Saddle River, N.J. 07458

Page 12: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

Linked Stacks

topentry

middleentry

bottomentrytop_node

X

top_node top_node

Node

Empty stack Stack of size 1

new_top

New

Old Old Oldtop_node

Link marked X has been removed.Colored links have been added.

node

top node second node bottom node

top_node

old_top

X

Linked Stacks Data Structures and Program Design In C++Transp. 12, Sect. 4.2, Linked Stacks 63 1999 Prentice-Hall, Inc., Upper Saddle River, N.J. 07458

Page 13: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

Class Declaration for Linked Stack

class Stack {public:

Stack( );bool empty( ) const;Error code push(const Stack entry &item);Error code pop( );Error code top(Stack entry &item) const;

protected:Node *top node;

};

Benefits of Class Implementation

Maintain encapsulation: If we do not use a class to containour stack, we lose the ability to set up methods for the stack.

Maintain the logical distinction between the stack itself, madeup of all of its entries (each in a node), and the top of the stack,which is a pointer to a single node.

Maintain consistency with other data structures and other im-plementations, where structures are needed to collect severalmethods and pieces of information.

Help with debugging by allowing the compiler to perform bet-ter type checking.

Benefits of Class Implementation Data Structures and Program Design In C++Transp. 13, Sect. 4.2, Linked Stacks 64 1999 Prentice-Hall, Inc., Upper Saddle River, N.J. 07458

Page 14: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

Garbage Accumulation

Problem example:

for (int i = 0; i < 1000000; i++) {Stack small;small.push(some data);

}

Suppose that the linked Stack implementation is used. Assoon as the object small goes out of scope, the data stored insmall becomes garbage. Over the course of a million iterationsof the loop, a lot of garbage will accumulate. The loop wouldhave executed without any problem with a contiguous Stackimplementation, where all allocated space for member data isreleased every time a Stack object goes out of scope.

Garbage Accumulation Data Structures and Program Design In C++Transp. 14, Sect. 4.3, Linked Stacks with Safeguards 65 1999 Prentice-Hall, Inc., Upper Saddle River, N.J. 07458

Page 15: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

The Destructor

Definition:

A destructor is a special method in a class that is automati-cally executed on objects of the class immediately before theygo out of scope.

The client does not need to call a destructor explicitly anddoes not even need to know it is present. Destructors areoften used to delete dynamically allocated objects that wouldotherwise become garbage.

Declaration:

The destructor must be declared as a class method withoutreturn type and without parameters. Its name is given byadding a ∼ prefix to the corresponding class name. Hence,the prototype for a Stack destructor is:

Stack :: ∼Stack( );

Stack :: ∼Stack( ) // Destructor/* Post: The Stack is cleared. */{

while (!empty( ))pop( );

}

PolicyEvery linked structure should be equipped with a destructor

to clear its objects before they go out of scope.

The Destructor Data Structures and Program Design In C++Transp. 15, Sect. 4.3, Linked Stacks with Safeguards 66 1999 Prentice-Hall, Inc., Upper Saddle River, N.J. 07458

Page 16: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

Dangers in Assignment

Stack outer stack;for (int i = 0; i < 1000000; i++) {

Stack inner stack;inner stack.push(some data);inner stack = outer stack;

}

outer_stack. top_node

inner_stack. top_node some_data

Lost data

X

Misbehaviors:

Lost data space.

Two stacks have shared nodes.

The destructor on inner stack deletes outer stack.

Such a deletion leaves the pointer outer stack.top node ad-dressing what a random memory location.

Dangers in Assignment Data Structures and Program Design In C++Transp. 16, Sect. 4.3, Linked Stacks with Safeguards 67 1999 Prentice-Hall, Inc., Upper Saddle River, N.J. 07458

Page 17: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

Overloading the Assignment Operator

In C++, we implement special methods, known as overloaded as-signment operators to redefine the effect of assignment. When-ever the C++ compiler translates an assignment expression of theform x = y, it first checks whether the class of x has an overloadedassignment operator.

Prototype:

void Stack :: operator = (const Stack &original);This declares a Stack method called operator = , the overloadedassignment operator, that can be invoked with

x.operator = (y); or x = y;

By looking at the type(s) of its operands, the C++ compiler cantell that it should use the overloaded operator rather than theusual assignment.

Implementation outline:

Make a copy of the data stacked in the calling parameter.

Clear out any data already in the Stack object being as-signed to.

Move the newly copied data to the Stack object.

Overloading the Assignment Operator Data Structures and Program Design In C++Transp. 17, Sect. 4.3, Linked Stacks with Safeguards 68 1999 Prentice-Hall, Inc., Upper Saddle River, N.J. 07458

Page 18: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

The Copy Constructor

Problem example:

void destroy the stack (Stack copy){}

int main( ){

Stack vital data;destroy the stack(vital data);

}

In this code, a copy of the Stack vital data is passed to the func-tion. The Stack copy shares its nodes with the Stack vital data,and therefore when a Stack destructor is applied to copy, atthe end of the function, vital data is also destroyed.

Solution:

If we include a copy constructor as a member of our Stack class,our copy constructor will be invoked whenever the compilerneeds to copy Stack objects. We can thus ensure that Stackobjects are copied using value semantics.

For any class, a standard way to declare a copy construc-tor is as a constructor with one argument that is declared asa constant reference to an object of the class.

Hence, a Stack copy constructor would normally have thefollowing prototype:

Stack :: Stack(const Stack &original);

The Copy Constructor Data Structures and Program Design In C++Transp. 18, Sect. 4.3, Linked Stacks with Safeguards 69 1999 Prentice-Hall, Inc., Upper Saddle River, N.J. 07458

Page 19: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

Implementation outline:

1. Deal with the case of copying an empty Stack.

2. Copy the first node.

3. Run a loop to copy all of the other nodes.

PolicyFor every linked class, include a copy constructor, or

warn clients that objects are copied with reference semantics.

The Copy Constructor Data Structures and Program Design In C++Transp. 19, Sect. 4.3, Linked Stacks with Safeguards 70 1999 Prentice-Hall, Inc., Upper Saddle River, N.J. 07458

Page 20: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

Modified Linked-Stack Specification

class Stack {public:// Standard Stack methods

Stack( );bool empty( ) const;Error code push(const Stack entry &item);Error code pop( );Error code top(Stack entry &item) const;

// Safety features for linked structures∼Stack( );

Stack(const Stack &original);void operator = (const Stack &original);

protected:Node *top node;

};

Modified Linked-Stack Specification Data Structures and Program Design In C++Transp. 20, Sect. 4.3, Linked Stacks with Safeguards 71 1999 Prentice-Hall, Inc., Upper Saddle River, N.J. 07458

Page 21: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

Class declaration, linked queues:

class Queue {public:// standard Queue methods

Queue( );bool empty( ) const;Error code append(const Queue entry &item);Error code serve( );Error code retrieve(Queue entry &item) const;

// safety features for linked structures∼Queue( );

Queue(const Queue &original);void operator = (const Queue &original);

protected:Node *front, *rear;

};

Extended linked queues:

class Extended queue: public Queue {public:

bool full( ) const;int size( ) const;void clear( );Error code serve and retrieve(Queue entry &item);

};

There is no need to supply explicit methods for the copy con-structor, the overloaded assignment operator, or the destruc-tor, since the compiler calls the corresponding method of thebase Queue object.

Class declaration, linked queues Data Structures and Program Design In C++Transp. 21, Sect. 4.4, Linked Queues 72 1999 Prentice-Hall, Inc., Upper Saddle River, N.J. 07458

Page 22: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

front

rear

Added to

Removedfrom frontof queue

queuerear ofX

X

X

Operation

son

alin

kedqu

eue

Data

Stru

ctures

and

Program

Design

InC

++

Tran

sp.22,Sect.4.4,L

inked

Qu

eues

73

1999P

rentice-H

all,Inc.,U

pperS

addleR

iver,N.J.07458

Page 23: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

Data Structures for Polynomials

1.0

3.0

5.0

–2.0 1.0 4.0

x4 5 0

3x5 – 2x3 + x2 + 4

4 0

5 3 2 0

1. Each node represents one term of a polynomial and is a struc-ture containing a coefficient, an exponent, and a pointer to thenext term of the polynomial.

2. The terms of every polynomial are stored in the order of de-creasing exponent within the linked queue, and no two termshave the same exponent.

3. Terms with zero coefficient are not stored in the polynomial.

4. The polynomial that is identically 0 is represented by an emptyqueue.

Data Structures for Polynomials Data Structures and Program Design In C++Transp. 23, Sect. 4.5, Application: Polynomial Arithmetic 74 1999 Prentice-Hall, Inc., Upper Saddle River, N.J. 07458

Page 24: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

Group Project Responsibilities

1. Allocation of tasks

2. Determining capabilities and specifications

3. Timetable

4. Stubs, drivers, and testing

5. Modifications, extensions, and revisions

6. Coordination and supervision

7. Documentation and reporting

Group Project Responsibilities Data Structures and Program Design In C++Transp. 24, Sect. 4.5, Application: Polynomial Arithmetic 75 1999 Prentice-Hall, Inc., Upper Saddle River, N.J. 07458

Page 25: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

Abstract Queues

DEFINITION A queue of elements of type T is a finite sequenceof elements of T together with the following operations:

1. Create the queue, leaving it empty.

2. Test whether the queue is Empty.

3. Append a new entry onto the rear of the queue, providedthe queue is not full.

4. Serve (and remove) the entry from the front of the queue,provided the queue is not empty.

5. Retrieve the front entry off the queue, provided the queueis not empty.

DEFINITION An extended queue of elements of type T is aqueue of elements of T together with the following additionaloperations:

4. Determine whether the queue is full or not.

5. Find the size of the queue.

6. Serve and retrieve the front entry in the queue, providedthe queue is not empty.

7. Clear the queue to make it empty.

Abstract Queues Data Structures and Program Design In C++Transp. 25, Sect. 4.6, Abstract Data Types 76 1999 Prentice-Hall, Inc., Upper Saddle River, N.J. 07458

Page 26: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

Sequence

Stack General list

Physical Linear Circular Linked

Array Array Array Array Simple Circular Array

AirportLine of

Mathematical

Abstract

Data structure

Implementation

Application

Concept

Code

Algorithm

Queue

concept

data type

people

withcounter

withflag

simulation

withskipped

entry

withtwo

pointers

withtail

pointer

withtwo

cursors

Refi

nem

ent

ofa

queu

eD

ataS

tructu

resan

dP

rogramD

esignIn

C+

+T

ransp.26,S

ect.4.6,Abstract

Data

Types

77

1999P

rentice-H

all,Inc.,U

pperS

addleR

iver,N.J.07458

Page 27: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

Pointers and Pitfalls

1. Before choosing implementations, be sure that all the datastructures and their associated operations are fully specifiedon the abstract level.

2. To help in the choice between linked and contiguous imple-mentations, consider the necessary operations on the datastructure. Linked structures are more flexible in regard toinsertions, deletions, and rearrangement; contiguous struc-tures are sometimes faster.

3. Contiguous structures usually require less computer memory,computer time, and programming effort when the items in thestructure are small and the algorithms are simple. When thestructure holds large records, linked structures usually savespace, time, and often programming effort.

4. Dynamic memory and pointers allow a program to adapt au-tomatically to a wide range of application sizes and provideflexibility in space allocation among different data structures.Automatic memory is sometimes more efficient for applica-tions whose size can be completely specified in advance.

5. Before reassigning a pointer, make sure that the object thatit references will not become garbage.

6. Set uninitialized pointers to NULL.

7. Linked data structures should be implemented with destruc-tors, copy constructors, and overloaded assignment operators.

8. Use private inheritance to model an “is implemented with”relationship between classes.

9. Draw “before” and “after” diagrams of the appropriate partof a linked structure, showing the relevant pointers and theway in which they should be changed. If they might help, alsodraw diagrams showing intermediate stages of the process.

Pointers and Pitfalls Data Structures and Program Design In C++Transp. 27, Chapter 4, Linked Stacks and Queues 78 1999 Prentice-Hall, Inc., Upper Saddle River, N.J. 07458

Page 28: Chapter 4 LINKED STACKS AND QUEUES - cs.gmu.edusetia/cs310/slides/ch4.pdf · Node(Node entry item, Node *add on = NULL);}; Node_entry entry Node *next Node (a) Structure of a Node

10. To determine in what order values should be placed in thepointer fields to carry out the various changes, it is usuallybetter first to assign the values to previously undefined point-ers, then to those with value NULL, and finally to the remain-ing pointers. After one pointer variable has been copied toanother, the first is free to be reassigned to its new location.

11. Be sure that no links are left undefined at the conclusion ofa method of a linked structure, either as links in new nodesthat have never been assigned or links in old nodes that havebecome dangling, that is, that point to nodes that no longerare used. Such links should either be reassigned to nodes stillin use or set to the value NULL.

12. Verify that your algorithm works correctly for an empty struc-ture and for a structure with only one node.

13. Avoid the use of constructions such as (p->next)->next, eventhough they are syntactically correct. A single object shouldinvolve only a single pointer dereferencing. Constructionswith repeated dereferencing usually indicate that the algo-rithms can be improved by rethinking what pointer variablesshould be declared in the algorithm, introducing new ones ifnecessary.

Pointers and Pitfalls Data Structures and Program Design In C++Transp. 28, Chapter 4, Linked Stacks and Queues 79 1999 Prentice-Hall, Inc., Upper Saddle River, N.J. 07458


Recommended