算法: 第二章 线性表、栈和队列

一、线性表 LIST

1、LIST:ADT



#include<iostream>
using namespace std;

template<typename E>
class List
{
private:
	void operator =(const List&){} //重载运算符
	List(const List&){} //拷贝构造
public:
	List(){}
	virtual ~List(){}

	virtual void insert(E& item) = 0;
	virtual void append(E& item) = 0;
	virtual void remove() = 0;
	virtual void clear() = 0;

	virtual void movetostart() = 0;
	virtual void movetoend() = 0;
	virtual void prev() = 0;
	virtual void next() = 0;
	virtual void movetocurrpos(int pos) = 0;
	virtual int currpos()const = 0;

	virtual int length()const = 0;
	virtual const E& getvalue()const = 0;

};

2、LIST:顺序表 array-based list

//顺序表
template<typename E>
class AList :public List<E>
{
private:
	int maxsize;
	int listsize;
	int curr;
	E* arraylist;

public:

	AList(int size)
	{
		maxsize = size;
		listsize = curr = 0;
		arraylist = new E[maxsize];
	}

	void clear()
	{
		delete[]arraylist;          //删掉原来的链表
		listsize = curr = 0;
		arraylist = new E[maxsize]; //创建新的空链表
	}

	void insert(E& item)
	{
		if (listsize < maxsize)
		{
			for (int i = listsize; i > curr; i--)
			{
				arraylist[i] = arraylist[i - 1];
			}
			arraylist[curr] = item;
			listsize++;
		}
		else
			cout << "list capacity exceeded" << endl;
	}

	 void append(E& item)
	{
		if (listsize < maxsize)
		{
			arraylist[listsize] = item;
			listsize++;
		}
		else
			cout << "list capacity exceeded" << endl;
	}

	 void remove() 
	{
		if (curr >= 0 && curr < listsize)
		{
			for(int i=curr;i<listsize-1;i++)
			{
				arraylist[i] = arraylist[i + 1];
			}
		listsize--;
		}
	}
	
	 void movetostart() { curr = 0; }
	 void movetoend() { curr = listsize; }
	 void prev() { if (curr != 0) curr--; }
	 void next() { if (curr <= listsize - 1) curr++; }

	 void movetocurrpos(int pos) 
	{
		if ((pos >= 0) && (pos <= listsize))
			curr = pos;
		else
			cout<<"Pos out of range"<<endl;
		
	}
	 int currpos()const { return curr; }

	 int length()const { return listsize; }

	 const E& getvalue() const
	{
		if (curr >= 0 && curr < listsize)
			return arraylist[curr];
		else
			cout << "No current element" << endl;
	}


};

3、LIST:linked list


//链式表 sequential list

//先建立节点
template<typename E>
class Link
{
public:
	E element;
	Link* next;

	Link(const E& e, Link* n = NULL) // 构造函数
	{
		element = e;  next = n;
	}
	Link( Link* n = NULL) // 构造函数(不初始化元素的值)
	{
		 next = n;
	}
};

template<typename E>
class LList :public List<E>
{
private:
	Link<E>* head;  //头节点为虚
	Link<E>* tail;
	Link<E>* curr;  //curr指针指向目标元素的前一个元素,指向栅栏|左边的元素
	int size;       //链表长度

	void init()
	{
		head = tail = curr = new Link<E>;
		size = 0;
	}
	void removeall()
	{
		while (head != NULL)
		{
			curr = head;
			head = head->next;
			delete curr;
		}
	}

public:

	LList(int s) { init(); }
	~LList() { removeall(); }

	void clear() { removeall(); init(); }
	void insert(const E& item)
	{
		curr->next = new Link<E>(item, curr->next); 
		if (tail == curr->next) tail=curr;
		size++;
	}
	void append(const E& item)
	{
		tail=tail->next = new Link<E>(item, NULL);
		size++;
	}
	E remove()
	{
		if (curr->next != NULL)
		{
			E item = curr->next->element;
			Link<E>* p = curr->next;
			if (curr->next == tail)
				tail = curr;
			curr->next = curr->next->next;
			delete p;
			size--;
			return item;
		}
	}

	void movetostart() { curr = head; }
	void movetoend() { curr = tail; }
	void prev()
	{
		if (curr == head) return;
		Link<E>* p = head;
		while(p->next !=curr) p = p->next;
		curr = p;
	}
	void next() 
	{
		if (curr != tail)    curr = curr->next;
	}

	void movetocurrpos(int pos)
	{
		if ((pos >= 0) && (pos <= size))
		{
			curr = head;
				for (int i = 0; i < pos; i++)
					curr = curr->next;
		}
	}
	int currpos()const 
	{
		Link<E>* p=head;
		int i = 0;
		for( i=0;p!=curr;i++)
			p=p->next;
	    return i;
	}

	int length() const { return size; }
	const E& getvalue() const
	{
		if(curr!=tail)
			return curr->next->element;
	}


};

4、LSIT:双链表

二、栈 STACK

1、STACK:ADT

template <class Elem> class Stack
{
private:
	void operator = (const Stack&) {}
	Stack(const Stack&) {}
public:

	virtual void clear() = 0;
	virtual void push(const Elem&) = 0;. 
	virtual Elem pop() = 0;
	virtual const Elem& topValue() const = 0;
	virtual int length() const = 0;
	//在成员函数的声明后边添加const,函数内部无法修改成员变量
};

2、STACK:顺序栈

// Array-based stack implementation
template <class Elem> class AStack : public Stack<Elem>
{

private:
	int maxsize; // Maximum size of stack
	int top;//The position to insert the new element
	        //top是已有元素的后一位
	Elem* listArray; //Array holding stack elements

public:
	AStack(int n) :maxsize(n), top(0) { listArray = new Elem[n]; }
	~AStack(){ delete[] listArray; }

	void clear() { top = 0; } 
	void push(const Elem& t)
	{
		if (top == maxsize - 1)
			cout << "full" << endl;
		else
			listArray[top++] = t;
	}
	Elem pop() //返回删除的元素
	{
		if (top == 0)
			return;
		else
			return listArray[--top];
	}
	const Elem& topValue() const
	{
		if (top == 0)
			return;
		else
			return listArray[top-1];
	}
	int length() const
	{
		return top;
	}
};

3、STACK:链式栈

template <class Elem>
class Link
{
public:
	Elem data;
	Link<Elem>* next;
	Link(Elem a, Link<Elem>* n):data(a),next(n){}
};
template <class Elem> class LStack : public Stack<Elem>
{
private:
	Link<Elem>* top; // Pointer to first elem
	                 //与顺序栈相反,top为第一个元素
	int size;        // Count number of elems

public:
	LStack() { top = nullptr; size = 0; }//空栈
	~LStack() { clear(); }
	void clear()
	{
		while (top != NULL) {
			Link<Elem>* temp = top;
			top = top->next;
			delete temp;
		}
		size = 0;
	}
	void push(const Elem& t)
	{
		top = new Link<Elem>(t, top);
		size++;

	}
	Elem pop() {
		if (!top)
			return;
		else
		{
			Elem it = top->element;
			Link<Elem>* ltemp = top->next;
			delete top;
			top = ltemp;
			size--;
			return it;
		}
	}
	const Elem& topValue() const {
		if (!top)
			return;
		else
			return top->element;
	}
	int length() const { return size; }


};

三、队列 QUEUE

1、QUEUE:ADT

template <class Elem> class Queue {
private:
   void operator = (const Queue&) { }     
   Queue(const Queue&) { }
public:
   Queue() { }
   virtual ~Queue() { }
   virtual void clear() = 0;
   virtual void enqueue(const Elem&) = 0;
   virtual Elem dequeue( ) = 0; 
   virtual const Elem& frontValue() const = 0;
   virtual int length() const = 0;
};

2、QUEUE:数组实现 ( 循环队列 )

//第i个元素 (i+1)% size
//Length = ((rear+size) - front + 1) % size
//Empty:  front  = =  (rear+1)%size   
//Full:      front  = =  (rear+2)%size



template <class Elem> class AQueue: public Queue<Elem>
 {
private:
  	int maxsize;         // Maximum size of queue
//Only store n – 1 elements in a Circular queue with the length n.

 	int front;          // Index of front element
  	int rear;           // Index of rear element
  	Elem *listArray;     // Array holding queue elements
public:
    AQueue(int size=defaultSize) {
       maxSize = size+1;
       rear=0;  front=1;
       listArray = new Elem[maxSize];
}
~AQueue () {delete [] listArray;
void clear() { rear=0; front=1; } 
void enqueue(const Elem& it) {
   Assert((rear+2) % size) != front, “Queue if full”); 
    rear = (rear+1) % size; // Circular increment
    listArray[rear] = it;
}
Elem dequeue(Elem& it) {                                                                                                          
    Assert (length() != 0, “Queue is empty);  
    it = listArray[front];
    front = (front+1) % maxsize; // Circular increment
    return it;
  }
const Elem& frontValue(Elem& it) const {
    Assert (length() != 0,”Queue if empty”);     
    return listArray[front];
 }
 virtual int length() const
   { return ((rear+size) - front + 1) % maxsize; }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值