1.数据结构与算法
2.数学预备知识
3.算法分析
4.线性表、栈和队列
4.1线性表
4.1.1线性表ADT(C++中ADT以抽象类实现)
#include<iostream>
using namespace std;
template<typename E>
class List{
private:
void operater =(const List&){
};
List(const List&){
};
public:
List(){
};
virtual ~List(){
};
virtual void clear()=0;
virtual void insert(const E& item)=0;
virtual void append(const E& item)=0;
virtual E remove()=0;
virtual void moveToStart()=0;
virtual void moveToEnd()=0;
virtual void prev()=0;
virtual void next()=0;
virtual int length() const =0;
virtual int currPos() const =0;
virtual void moveToPos(int Pos)=0;
virtual const E& getValue() const =0;
};
bool find(Link<int>& L,int k)
{
int it;
for(L.moveToStart();L.currPos()<L.length();L.next()){
it=getValue();
if(k==it)
return true;
}
return false;
}
4.1.2顺序表的实现:
template<typename E>
class AList:public List<E>{
private:
int maxSize;
int listSize;
int curr;
E* listArray;
public:
Alist(int size=defaultSize){
maxSize=size;
listSize=curr=0;
listArray = new E[maxSize];
}
~AList(){
delete [] listArray;}
void insert(const E& it){
Assert(listSize<maxSize,"list capacity exceeded");
for(int i=listSize;i>curr;i--){
listArray[i]=listArray[i-1];
}
listArray[curr]=it;
listSize++;
}
void append(const E& it){
Append(listSize<maxSize,"List capacity exceed");
listArray[listSize++]=it;
}
E remove(){
Assert((cur>=0)&&(cur<listSize),"No element");
E it = listArray[curr];
for(int i=curr;i<listSize-1;i++)
list[i]=list[i+1];
listSize--;
return it;
}
void moveToStart(){
curr=0};
void moveToEnd(){
curr=listSize-1};
void prev(){
if(curr>0) curr--};
void next(){
if(curr<listSize) curr++};
int length() const {
return listSize;}
int currPos() const{
return curr};
void moveToPos(int pos){
Assert(pos>=0&&pos<=listSize,"Pos out of range");
curr=pos;
}
const E& getValue() const{
Assert(curr>=0&&curr<listSize,"No element");
return listArray[curr];
}
};
4.1.3链表实现
template<typename E>
class Link{
private:
E element;
Link *next;
Link(const E& e,Link* p=NULL){
element=e;next=p;}
Link(Link* p=NULL){
next=p;}
};
template<typename E>
class LList:public List<E>{
private:
Link<E>* head;
Link<E>* tail;
Link<E>* curr;
int cnt;
void init(){
head=tail=curr=new Link<E>;
cnt=0;
}
void removeall(){
while(head!=NULL){
curr=head;
head=head->next;
delete curr;
}
}
public:
LList(int size=defaultSize){
init();}
~LList(){
removeall();}
void print(){
};
void clear(){
removeall();init();}
void insert(const E& it){
Link<E>* p=new Link<E>;
p->element=it;
p->next=curr->next;
curr->next=p;
if(tail==curr)
tail=curr->next;
cnt++;
}
void append(const E& it){
tail->next=new Link(it,NULL);
tail=tail->next;
cnt++;
}
E remove(){
Assert(curr->next!=NULL,"No element");
Link<E>* temp=curr->next;
E it=curr->next->element;
if(tail==curr->next)
tail=curr;
curr->next=curr->next->next;
delete temp;
cnt--;
return it;
}
void moveToStart(){
curr=head;}
void moveToEnd(){
curr=tail;}
void prev(){
if(curr=head)return;
Link<E>* temp=head;
while(temp->next!=curr)temp=temp->next;
curr=temp;
}
void next(){
if(curr==tail)return;
curr=curr->next;
}
int length() const{
return cnt;}
int currPos() const{
Link<E>* temp=head;
int i;
for(i=0;temp!=curr;i++)
temp=temp->next;
return i;
}
void moveToPos(int pos){
Assert(pos>=0&&pos<=cnt,"Position out of range");
curr=head;
for(int i=0;i<=pos;i++)
curr-curr->next;
}
const E& getValue() const{
Assert(curr->next!=NULL,"No value");
return curr->next->element;
}
};
4.1.4freelists可利用空间表
template<typename E>
class Link{
private:
E element;
Link *next;
Link(const E& e,Link* p=NULL){
element=e;next=p;}
Link(Link* p=NULL){
next=p;}
static Link<E>* freelist;
public:
void* operator new(size_t){
if(freelist==NULL)return ::new Link;
Link<E>* temp=freelist;
freelist=freelist->next;
return temp;
}
void operator delete(void* ptr){
(Link<E>*)ptr->next=freelist;
freelist=((Link<E>*)ptr);
}
};
template<typename E>
Link<E>* Link<E>::freelist=NULL;
4.1.5 双链表
template<typename E>
class DLink{
private:
static DLink* freelist;
public:
E element;
DLink<E>* next;
DLink<E>* prev;
DLink(const E& e,DLink<E>* n=NULL,DLink<E>* p=NULL){
element=e;
next=n;
prev=p
}
DLink(DLink<E>* n=NULL,DLink<E> p=NULL){
next=n;
prev=p;
}
void* operator new(size_t){
if(freelist==NULL)return ::new Link;
Link<E>* temp=freelist;
freelist=freelist->next;
return temp;
}
void operator delete(void* ptr){
(Link<E>*)ptr->next=freelist;
freelist=((Link<E>*)ptr);
}
};
template<typename E>
DLink<E>* DLink<E>::freelist=NULL;
template<typename E>
class DList:public List{
private:
DLink<E>* head;
DLink<E>* curr;
DLink<E>* tail;
int cnt;
public:
void insert(const E& it){
DLink<E>* temp=new DLink<E>(it);
curr->next->prev=temp;
temp->next=curr->next;
temp->prev=curr;
curr->next=temp;
cnt++;
}
void append(const E& it){
DLink<E>* temp=new DLink<E>(it);
tail->prev->next=temp;
temp->prev=tail->prev;
temp->next=tail;
tail->prev=temp;
cnt++;
}
E remove(){
if(curr->next==tail)
return NULL;
DLink<E>* it=curr->next;
E it=it->element;
curr->next->next->prev=curr;
curr->next=curr->next->next;
delete it;
cnt--;
return it;
}
void prev(){
if(curr!=head)curr=curr->prev;}
};
4.2 栈
4.2.1栈ADT
#include<bits/stdc++.h>
using namespace std;
template<typename E>
class Stack{
private:
void operator=(const Stack&){
};
Stack(const Stack&){
};
public:
Stack(){
};
virtual void clear()=0;
virtual void push(const E& it)=0;
virtual E pop()=0;
virtual const E& top() const =0;
virtual int length()=0;
};
4.2.2数组实现
template<typename E>
class AStack:public Stack<E>{
private:
int maxSize;
int top;
E* listArray;
public:
AStack(int size=defaultSize){
maxSize=size;
top=0;
listArray=new E[size];
}
~AStack(){
delete[]listArray;}
void clear(){
top=0;}
void push(const E& it){
Assert(top!=maxSize,"Stack is full");
listArray[top++]=it;
}
E pop(){
Assert(top!=0,"No element");
return listArray[--top];
}
const E& top(){
Assert(top!=0,"Stack is empty");
return listArray[top-1];
}
int <