Abs/Concrete Comments for a Queue

Abstract and Concrete Comments for a Queue

Challenge:

Write the abstract and concrete comments for the following implementation of a queue. Write the representation invariant.

//Uncommented queue program

//queue.h

#include <iostream.h>

const int maxq=5;

typedef int qelt;

class queue {
  int rear;
  qelt elt[maxq];
  void shift ();
  public:
    queue();
    int empty ();
    int addq (qelt e);
    int delq (qelt &e);
};

//queue.cc

#include "queue.h"

void queue::shift () {
  for (int i=0;i<rear;i++)
  elt[i]=elt[i+1];
}

queue::queue () {
  rear = 0;
}

int queue::empty () {
  return (rear==0);
}

int queue::addq (int e) {
  if (rear<maxq) {
    elt[rear++]=e;
    return 1;
  }
  return 0;
}

int queue::delq (int &e) {
  if (!empty()) {
    e=elt[0];
    rear--;
    shift ();
    return 1;
  }
  return 0;
}

//main.cc

#include "queue.h"

void checkempty (queue q) {
  if (q.empty())
    cout << "queue is empty\n";
  else
    cout << "queue is not empty\n";
}

main () {
  queue q;
  checkempty (q);
  for (int i=1;i<7;i++)
    if (!q.addq(i))
      cout << "cannot add element " << i << '\n';
  checkempty (q);
  qelt a;
  while (q.deleteq(a))
    cout << a;
  cout << endl;
}


Solution:

//queue.h

//Representation invariant: 0<=rear<=maxq

#include <iostream.h>

const int maxq=5;

typedef int qelt;

class queue {
  int rear;
  qelt elt[maxq];
  void shift ();
  //abs: q==<q1,q2,...,qn> for n the number of elements in q ->
  // q==<q1,q2,...,qn>
  //con: elt[i] for 0<=i<rear -> elt[i]=elt[i+1]
  public:
    queue();
    //abs: q = <>
    //con: rear = 0
    int empty ();
    //abs: empty = (q==<>)
    //con: return (rear==0)

    int addq (qelt e);
    //abs: q not full -> q, addq = q'~<e>, 1 | addq = 0
    //con: rear<maxq -> elt[rear'], rear, addq = e, rear'+1, 1 | addq = 0
    int delq (qelt &e);
    //abs: q==<frontelt>~<restofq> for <frontelt> an elt ->
    // q, e, delq = <restofq>, <frontelt>, 1 | delq = 0
    //con: rear>0 -> elt[i]=elt[i+1] for 0<=i<rear', rear=rear'-1,delq=1
    // | delq=0;

};


Home Up Next