数据结构List,叫列表,也叫线性表。栅栏fence的概念,也就是操作定位。

List的抽象模板类代码:

 1 /* class List */
 2 template <class Elem>
 3 class List
 4 {
 5 public:
 6     //set the position of the fence
 7     virtual bool setPos(int pos) = 0;
 8     //insert an element
 9     virtual bool insert(const Elem& e) = 0;
10     //remove an element 
11     virtual bool remove(Elem& e) = 0;
12 };

Alistl类的模板类代码:

 1 /* class AList */
 2 const int DefaultListSize = 100;
 3 template <class Elem>
 4 class AList:public List<Elem>
 5 {
 6 private:
 7     Elem* listArray;//Array holding list
 8     int maxSize; //Maximum size of list
 9     int listSize; //Actual elem count
10     int fence; //Position of fence;
11 public:
12     AList(int size=DefaultListSize){
13         listArray = new Elem[size];
14         maxSize = fence = 0;
15     }
16     ~AList(){delete[] listArray;}
17     //重写虚函数要声明
18     virtual bool setPos(int pos);
19     virtual bool insert(const Elem& e);
20     virtual bool remove(Elem& e);
21     bool getValue(Elem& it)const;
22 };
23 //set the Position of the fence
24 template <class Elem>
25 bool AList<Elem>::setPos(int pos){
26     if((pos>=0)&&(pos<=listSize))//判断是否在合理的区间
27         fence = pos;
28     return (pos>=0)&&(pos<=listSize);
29 }
30 //get the first element after the fence
31 template <class Elem>
32 bool AList<Elem>::getValue(Elem& it)const{
33     if(fence == listSize) return false;//判断是否重叠
34     else{
35         it = listArray[fence];
36         return true;
37     }
38 }
39 template <class Elem>
40 bool AList<Elem>::insert(const Elem& item){
41     if(listSize == maxSize) return false;//判断是否有空间
42     //Shift Elems up to make room
43     for(int i=listSize; i>fence; i--)
44         listArray[i] = listArray[i-1];
45     listArray[fence] = item;
46     listSize++;//Increment list size
47     return true;
48 }
49 template <class Elem>
50 bool AList<Elem>::remove(Elem& it){
51     if(fence == listSize) return false;
52     it = listArray[fence];//Copy Elem
53     for(int i=fence; i<listSize; ++i)
54         listArray[i] = listArray[i+1];
55     listSize--; //Decrement size
56     return true;
57 }

链表结点模板类代码:

 1 //list node
 2 template <class Elem>
 3 class Node{
 4 public:
 5     Elem element;//Value for this node
 6     Node* next; //Pointer to next node
 7     Node(){next = NULL;}
 8     Node(const Elem& elemval,Node* nextval = NULL)
 9     {element = elemval; next = nextval;}
10 };

LList模板类代码:

 1 template <class Elem>
 2 class LList:public List<Elem>
 3 {
 4 private:
 5     Node<Elem>* head;//Point to list header
 6     Node<Elem>* tail;//Pointer to last Elem
 7     Node<Elem>* fence;//Last element on left
 8     int length; //Length of list
 9 public:
10     LList()
11     {
12         fence = head = tail = new Node<Elem>;
13         length = 0;
14     }
15     virtual bool getValue(Elem& it)const;
16     virtual bool insert(const Elem& item);
17     virtual bool remove(Elem& it);
18     virtual bool setPos(int pos);
19 };
20 template <class Elem>
21 bool LList<Elem>::getValue(Elem& it)const{
22     if(fence == tail) return false;
23     it = fence->next->element;
24     return true;
25 }
26 template <class Elem>
27 bool LList<Elem>::insert(const Elem& item){
28     fence->next = new Node<Elem>(item,fence->next);
29     if(tail == fence) tail = fence->next;
30     length++;
31     return true;
32 }
33 template <class Elem>
34 bool LList<Elem>::remove(Elem& it){
35     if(fence->next == NULL) return false;
36     it = fence->next->element;//Remember value_comp
37     Node<Elem>* ltemp = fence -> next;
38     fence->next = ltemp->next;//Remove
39     if(tail == ltemp) 
40         tail = fence; //Reset tail
41     delete ltemp;//Reclaim space
42     length--;
43     return true;
44 }
45 template <class Elem>
46 bool LList<Elem>::setPos(int pos){
47     if((pos < 0) || (pos > length))
48         return false;
49     fence = head;
50     for(int i=0; i<pos; ++i)
51         fence = fence->next;
52     return true;
53 }

Stack抽象模板类代码:

 1 //Stack abstract class
 2 template <class Elem>
 3 class Stack
 4 {
 5 public:
 6     //Push an element onto the top of the stack
 7     virtual bool push(const Elem& e) = 0;
 8     //Remove the element at the top of the stack
 9     virtual bool pop(Elem& e) = 0;
10     //Get a copy of the top element in the stack
11     virtual bool topValue(Elem& e) const = 0;
12     //Return the number of element in the stack
13     virtual int getLength() const = 0;
14     //Reinitialize the stack
15     virtual void clear() = 0;
16 };

基于数组的栈模板类代码:

 1 //Array-based stack implementation
 2 template <class Elem>
 3 class AStack:public Stack<Elem>
 4 {
 5 private:
 6     Elem* listArray;//Array holding stack elements
 7     int size; //Maximum size of stack
 8     int top; //The position to insert the new element
 9 public:
10     AStack(int sz)
11     {
12         size = sz;
13         top = 0;
14         listArray = new Elem[sz];
15     }
16     ~AStack(){delete[] listArray;}
17     virtual bool push(const Elem& item);
18     virtual bool pop(Elem& it);
19 };
20 template <class Elem>
21 bool AStack<Elem>::push(const Elem& item){
22     if(top == size) return false; //Stack is full
23     else{
24         listArray[top++] = item; 
25         return true;
26     }
27 }
28 //pop top element 
29 template <class Elem>
30 bool AStack<Elem>::pop(Elem& it){
31     if(top == 0) return false;
32     else{
33         it = listArray[--top];
34         return true;
35     }
36 }

队列抽象模板类代码:

 1 template <class Elem>
 2 class Queue
 3 {
 4 public:
 5     virtual bool enqueue(const Elem& e) = 0;
 6     virtual bool dequeue(Elem& e) = 0;
 7     virtual bool frontValue(Elem& e) = 0;
 8     virtual int getLength() const = 0;
 9     virtual void clear() = 0;
10 }

基于链表的队列模板类代码:

 1 template <class Elem>
 2 class LQueue:public Queue<Elem>
 3 {
 4 private:
 5     Node<Elem>* head;//Point to list header
 6     Node<Elem>* tail;//Pointer to last Elem
 7     int length; //Length of list
 8 public:
 9     LQueue()
10     {   //带头结点, 空队列head == tail
11         head = tail = new Node<Elem>;
12         length = 0;
13     }
14     virtual bool enqueue(const Elem& e);
15     virtual bool dequeue(Elem& e);
16     virtual bool frontValue(Elem& e);
17     virtual int getLength() const;/* 不能与成员变量重名*/
18     virtual void clear(); 
19 };
20 template <class Elem>
21 bool LQueue<Elem>::frontValue(Elem& it){
22     if(head == tail) return false;//队列空
23     it = head->next->element;
24     return true;
25 }
26 template <class Elem>
27 bool LQueue<Elem>::enqueue(const Elem& item){ //入队
28     Node<Elem>* ltemp = new Node<Elem>(item,NULL);
29     tail->next = ltemp; //入队,插入尾部
30     tail = ltemp; //更新尾部
31     length++;
32     return true;   
33 }
34 template <class Elem>
35 bool LQueue<Elem>::dequeue(Elem& it){
36     if(head == tail) return false;//队列空
37     it = head->next->element;//Remember value_comp
38     Node<Elem>* ltemp = head -> next;
39     head->next = ltemp->next;//Remove
40     if(tail == ltemp)//最后一个出队 
41         tail = head; //队列空
42     delete ltemp;//Reclaim space
43     length--;
44     return true;
45 }
46 template <class Elem>
47 int LQueue<Elem>::getLength() const{
48     return length;
49 }
50 template <class Elem>
51 void LQueue<Elem>::clear(){
52     while(head){
53         tail = head->next;
54         delete head;
55         head = tail;
56     }
57 }