1. 程式人生 > >資料結構表棧佇列的總結

資料結構表棧佇列的總結

   在插入元素的時候首先判斷是否滿秩,刪除元素時判斷是否為空秩,順序表一類主要通過看實際長度
   與分配長度大小進行判斷,連結串列一類主要通過指標大小進行判斷如top頭指標,佇列主要通過rear與
   front是否相等及利用s標誌進行判斷。
 一、順序表
       順序表主要有初始化、輸出表屬性、插入、刪除、查詢、定位等基本操作
       筆者通過以下程式碼來幫助複習順序表中可能會用到的操作,但複雜度問題
       有待改進。 
 //資料結構之一順序表
 #include<iostream>
 using namespace std;
 
 template <class T>
 class sq_List
 {
 	private:
 		int mm;//儲存空間容量 
 		int nn;//順序表長度 
 		T*v;//順序表首地址存放 
 	public:
 		sq_List(){mm=0;nn=0;return;}
 		sq_List(int);//建立空順序表,申請儲存空間
		void prt_sq_List();//順序輸出表中元素與長度
		int flag_sq_List();//檢測順序表中狀態
		void ins_sq_List(int,T);//在表中指定元素前插入新元素
		void del_sq_List(int);//在表中刪除指定元素 
		void search_sq_List(T);//查詢功能 
  } ;
  //建立空順序表
  template<class T>
  sq_List<T>::sq_List(int m)
  {
  	mm=m;//儲存空間容量 
  	v=new T[mm];//動態申請儲存空間 
  	nn=0;//順序表長度為0,建立空順序表 
  	return;
  }
  //順序輸出表中元素
  template<class T>
  void sq_List<T>::prt_sq_List()
  {
  	cout<<"nn="<<nn<<endl;
  	for(int i=0;i<nn;i++) cout<<v[i]<<endl;
  }
  //檢測順序表狀態
  template<class T>
  int sq_List<T>::flag_sq_List() 
  {
  	if(nn==nn) return -1;
  	if(nn==0) return 0;
  	return 1;
  }
  //插入元素 
  template<class T>
  void sq_List<T>::ins_sq_List(int i,T b)
  {
  	if(nn==mm) cout<<"overflow"<<endl;
  	if(i>nn) i=nn+1;
  	if(i<1) i=1;
  	for(int k=nn;k>=i;k--)
  		v[k]=v[k-1];
  	v[i-1]=b;
  	nn=nn+1;//順序表長度加一 
  	return;
	  
  }
  //刪除元素
  template<class T>
  void sq_List<T>::del_sq_List(int i)
  {
  	if(nn==0) cout<<"underflow"<<endl;
  	if(i<1||i>nn) cout<<"Not this element found in this table"<<endl;
  	for(int k=i;k<nn;k++)
  		v[k-1]=v[k];
  	nn=nn-1;//順序表長度減一
	return; 
   } 
   //查詢元素
   template<class T>
    void sq_List<T>::search_sq_List(T p)
    {
    	int t=0,i=nn;
    	for(i=nn;i>=0;i--)
    	{
    		if(v[i]==p) break;//簡單查詢的複雜度有點大,可以用二分查詢改進,但筆者主要是為了整理資料結構基本操作 
    		else t=1;;
		}
		if(t) cout<<"Cannot find thie element"<<endl;
	}

  二、順序棧運算
  棧的特點主要是先進後出,通過top指標進行控制,空棧時top指標指向棧底,
  插入刪除操作通過top指標與開拓可利用棧空間進行實現,在順序表的基本操作上
  增加了指標控制的難度。
#include<iostream>
using namespace std;

template<class T>
class sq_Stack{
	private:
		int mm;
		int top;
		T*s;
	public:
		sq_Stack(int);//建立空棧,初始化
		void prt_sq_Stack();
		int flag_sq_Stack();//檢測棧狀態 
		void ins_sq_Stack(T);//入棧操作只能在棧頂一側進行
		T del_sq_Stack();//退棧
		T read_sq_Stack();//讀取棧頂元素 
		 
};

template<class T>
sq_Stack<T>::sq_Stack(int m){
	mm=m;
	top=0;
	s=new T[mm];
	return;
}

template<class T>
void sq_Stack<T>::prt_sq_Stack(){
	cout<<"top="<<top<<endl;
	for(int i=top;i>0;i--) cout<<s[i-1]<<endl;
	return;
}

template<class T>
sq_Stack<T>::flag_sq_Stack(){
	if(top==0) return 0;
	if(top==mm) return -1;
	return 1;
}

template<class T>
void sq_Stack<T>::ins_sq_Stack(T x){
	if(top==mm) cout<<"Stack Overflow"<<endl;
	top=top+1;
	s[top-1]=x;
	return;
}

template<class T>
T sq_Stack<T>::del_sq_Stack(){
	T y;
	if(top==0) cout<<"Stack Underlow"<<endl;
	y=s[top-1];
	top=top-1;
	return y;
}
template<class T>
T sq_Stack<T>::read_sq_Stack()
{
	if(top==0)
	{
		cout<<"Stack empty"<<endl;return 0;
	}
	return s[top-1];//返回棧頂元素 
}
 三、迴圈佇列結構:迴圈佇列主要由front與rear指標進行控制,具有先進先出特點
 加入的元素插入到線性表末尾並且從線性表的頭部取出實現刪除元素。
#include<iostream>
using namespace std;

template<class T>
class sq_queue{
	private:
		int mm;
		int front;//頭指標 
		int rear;//尾指標 
		int s;//用於標誌是否為滿佇列或者空佇列,這兩種情況下rear=front都成立
		T *q;
	public:
		sq_queue(int);
		void prt_sq_queue();
		int flag_sq_queue();
		void ins_sq_queue(T);
		T del_sq_queue();
};
//建立mm的空迴圈佇列
template<class T>
sq_queue<T>::sq_queue(int m) 
{
	mm=m;
	q=new T[mm];//申請mm長度的儲存空間
	front=mm;
	rear=mm;
	s=0;
	return; 
}

template<class T>
void sq_queue<T>::prt_sq_queue()
{
	cout<<"rear="<<rear<<endl;
	cout<<"front"<<front<<endl;
	if(s==0) 
	{
		cout<<"queue empty"<<endl;return;
	}
	int i=front;
	do{
		i=i+1;
		if(i==mm+1) i=1;
		cout<<q[i-1]<<endl;
	}while(i!=rear);
}

template<class T>
int sq_queue<T>::flag_sq_queue(){
	if(s==1&&rear==front) return -1;
	if(s==0) return 0;
	return 1;
}

template<class T>
void sq_queue<T>::ins_sq_queue(T x)
{
	if(s==1&&rear==front) cout<<"Queue Overflow"<<endl;
	rear=rear+1;
	if(rear==mm+1) rear=1;
	q[rear-1]=x;
	s=1;
	return;
	
}

template<class T>
T sq_queue<T>::del_sq_queue()
{
	T y;
	if(s==0) cout<<"Queue underflow"<<endl;
	front=front+1;
	if(front=mm+1) front=1;
	y=q[front-1];
	if(front==rear) s=0;
	return y;
}
  四、線性連結串列
//建立線性連結串列
#include<iostream>
using namespace std;
template<class T>
struct node
{
	T d;
	node*next;
 } ;
 template<class T>
 class linked_List
 {
 	private:
 		node<T>*head;
 	public:
 		linked_list();
 		void prt_linked_list();
 		void ins_linked_list(T,T);
 		int del_linked_list(T);
 };
 
 template<class T>
 linked_List<T>::linked_list()
 {
 	head=NULL;return;
 }
 
 template<class T>
 void linked_List<T>::prt_linked_list()
 {
 	node<T>*p;
 	p=head;
 	if(p==NULL){
 		cout<<"空連結串列"<<endl;return;
	 }
	 do{
	 	cout<<p->d<<endl;
	 	p=p->next;
	 }while(p!=NULL);
	 return;
 }
 
 template<class T>
 void linked_List<T>::ins_linked_list(T x,T b)
 {
 	node<T>*p,*q;
 	p=new node<T>;//申請新的空間 可利用棧 
 	p->d=b;
   //原連結串列為空表
   if(head==NULL)
   {
   	head=p;p->next=NULL;return;
	} 
	if(head->d==x)
	{
		p->next=head;head=p;return;
	}
	q=head;
	while((q->next!=NULL)&&(((q->next)->d)!=x))
	q=q->next;
	p->next=q->next;q->next=p;
	return ;
 }
 
 template<class T>
	 int linked_List<T>::del_linked_list(T x)
 {
 	node<T>*p,*q;
 	if(head==NULL) return 0;
 	if((head->d)==x)
 	{
 		p=head->next;delete head;head=p;return 1; 
	 }
	 q=head;
	 while((q->next)!=NULL&&(((q->next)->d)!=x))
	 	q=q->next;
	if(q->next==NULL) return 0;
	p=q->next;q->next=p->next;
	delete p;
	return 1;
 }
 
       五、鏈棧
       鏈棧而言多了結點與指標域的定義與宣告,其餘過程相似。
//鏈式佇列比順序佇列多了結點的結構
#include<iostream>
using namespace std;

template<class T>
struct node{
	T d;
	node*next;
};

template<class T>
class linked_Stack{
	private:
		node<T>*top;
	public:
		linked_Stack();
		void prt_linked_Stack(); 
		int flag_linked_Stack();
		void ins_linked_Stack(T);
		T del_linked_Stack();
		T read_linked_Stack();
}; 

template<class T>
linked_Stack<T>::linked_Stack(){
	top=NULL;
	return;
}

template<class T>
 void linked_Stack<T>::prt_linked_Stack()
 {
 	node<T>*p;
 	p=top;
 	if(p==NULL){
 		cout<<"empty Stack!"<<endl;return;
	 }
	 do{
	 	cout<<p->d<<endl;
	 	p=p->next;
	 }while(p!=NULL);
	 return;
 }

template<class T>
int linked_Stack<T>::flag_linked_Stack()
{
	if(top==0) return 0;
	return 1;
}

template<class T>
void linked_Stack<T>::ins_linked_Stack(T x)
{
	node<T>*p;
	p=new node<T>;
	p->d=x;
	p->next=top;
	top=p;
	return;
}

template<class T>
T linked_Stack<T>::del_linked_Stack()
{
	T y;
	node<T>*q;
	if(top==NULL) {
		cout<<"空棧!"<<endl;
		return 0;
	}
	q=top;
	y=q->d;
	top=q->next;
	delete q;
	return y;
}

template<class T>
T linked_Stack<T>::read_linked_Stack()
{
	if(top==NULL){
		cout<<"空棧!"<<endl;return;
	}
	return top->d;
}
  六、帶鏈佇列
#include<iostream>
using namespace std;

template<class T>
struct node{
	T d;
	node*next;
};
template<class T>
class linked_queue{
	private:
		node<T>*front;
		node<T>*rear;
	public:
		linked_queue();
		void prt_linked_queue();
		int flag_linked_queue();
		T del_linked_queue();
		void ins_linked_queue(T);
};

template<class T>
linked_queue<T>::linked_queue()
{
	front=NULL;rear=NULL;
	return;
}

template<class T>
void linked_queue<T>::prt_linked_queue()
{
	node<T>*p;
	p=front;
	if(p==NULL) {
		cout<<"空佇列!"<<endl;
		return; 
	}
	do{
		cout<<p->d<<endl;
		p=p->next;
	}while(p!=NULL);
	return;
}

template<class T>
int linked_queue<T>::flag_linked_queue()
{
	if(front==NULL) return 0;
	return 1;
}

template<class T>
void linked_queue<T>::ins_linked_queue(T x)
{
	node<T>*p;
	p=new node<T>;
	p->d=x;p->next=NULL;
	if(rear==NULL)
		front=p;
	else
	rear->next=p;
	rear=p;
	return;
}

template<class T>
T linked_queue<T>::del_linked_queue()
{
	T y;
	node<T>*q;
	if(front==NULL) {
		cout<<"空佇列"<<endl;
		return ;
	}
	y=front->d;
	q=front;
	front=q->next;
	delete q;
	if(front==NULL) rear=NULL;
	return y;
}
七、迴圈連結串列
//迴圈連結串列
#include<iostream>
using namespace std;

template<class T>
struct node{
	T d;
	node*next;
}; 

template<class T>
class linked_clist
{
	private:
		node<T>*head;
	public:
		linked_clist();
		void prt_linked_clist();
		void ins_linked_clist(T,T);
		int del_linked_clist(T);
};

template<class T>
linked_clist<T>::linked_clist()
{
	node<T>*p;
	p=new node<T>;
	p->d=0;p->next=p;
	head=p;
	return;
}

template<class T>
void linked_clist<T>::prt_linked_clist()
{
	node<T>*p;
	p=head->next;
	if(p==head) {
		cout<<"空迴圈連結串列"<<endl;
	}
	do{
		cout<<p->d<<endl;
		p=p->next;
	}while(p!=head);
	return;
}

template<class T>
void linked_clist<T>::ins_linked_clist(T x,T b)
{
	node<T>*p,*q;
	p=new node<T>;
	p->d=b;
	q=head;
	while((q->next!=head)&&(((q->next)->d)!=x))
		q=q->next;;
	p->next=q->next;
	q->next=p;
	return;
}

template<class T>
 int linked_clist<T>::del_linked_clist(T x)
 {
 	node<T>*p,*q;
 	q=head;
 	while((p->next!=head)&&(((q->next)->d)!=x))
 		q=q->next;
 	if(q->next==head) return 0;
 	p=q->next;
 	q->next=p->next;
 	delete p;
 	return 1;
 }