一.順序棧的實(shí)現(xiàn)
A.棧的定義
1.棧是一種特殊的線性表
2.棧僅能在線性表的一端進(jìn)行操作
a.棧頂:允許操作的一端
b.棧底:不允許操作的一端
B.棧的特性
后進(jìn)先出(圖示)
C.棧的操作
1.創(chuàng)建棧
2.銷(xiāo)毀棧
3.清空棧
4.進(jìn)棧
5.出棧
6.獲取棧頂元素
7.獲取棧的大小
D.棧的實(shí)現(xiàn)
template <typename T>
class Stack:public Object
{
public:
virtual void push(const T&e)=0;//入棧的操作
virtual void pop()=0;//出棧的操作
virtual T top()const =0;//棧頂元素
virtual void clear()=0;//清除
virtual int size()const=0;//棧的大小
};
棧的順序?qū)崿F(xiàn)
E.StaticStack設(shè)計(jì)要點(diǎn)
類(lèi)模板:
1.使用原生數(shù)組作為棧的存儲(chǔ)空間
2.使用模板參數(shù)決定棧的大容量
部分代碼如下
template <typename T,int N>
class StaticStack:public Stack<T>
{
protected:
T m_space[N];//棧的存儲(chǔ)空間
int m_top;//棧頂標(biāo)識(shí)
int m_size;//當(dāng)前棧的大小
public:
StaticStack();//初始化成員變量
int capacity()const;
//..............
}
完整實(shí)現(xiàn)代碼
#include "Stack.h"
#include "Exception.h"
namespace MyLib
{
template<typename T,int N>
class StaticStack: public Stack<T>
{
protected:
T m_space[N];//棧存儲(chǔ)空間
int m_top;//棧頂元素標(biāo)識(shí)
int m_size;//表示當(dāng)前棧里面的數(shù)據(jù)個(gè)數(shù)
public:
StaticStack()//構(gòu)造函數(shù)初始化成員
{
m_top=-1;
m_size=0;
}
int capacity()const
{
return N;//返回大存儲(chǔ)量
}
void push(const T &e)
{//入棧的操作
if(m_size<N)
{
m_space[m_top+1]=e;
m_top++;
m_size++;
}
else
{
THROW_EXCEPTION(InvalidOperationException,"...");
}
}
void pop()
{
if(m_size>0)
{//出棧的操作
m_top--;
m_size--;
}
else
{
THROW_EXCEPTION(InvalidOperationException,"...");
}
}
T top() const
{
if(m_size>0)
{
return m_space[m_top];
}
else
{
THROW_EXCEPTION(InvalidOperationException,"...");
}
}
void clear()
{
m_top=-1;
m_size=0;
}
int size()const
{
return m_size;
}
};
}
二.鏈?zhǔn)綏5膶?shí)現(xiàn)
A.鏈?zhǔn)綏5脑O(shè)計(jì)要點(diǎn)
1.類(lèi)模板,抽象類(lèi)Stack的直接子類(lèi)
2.在內(nèi)部組合使用LinkList類(lèi),實(shí)現(xiàn)類(lèi)的鏈?zhǔn)酱鎯?chǔ)
3.知道單鏈表成員對(duì)象的頭部進(jìn)行操作
代碼實(shí)現(xiàn)如下
#include "Stack.h"
#include "LinkList.h"
namespace MyLib
{
template <typename T>
class LinkStack:public Stack<T>
{
protected:
LinkList<T>m_list;
public:
void push(const T&e)
{
m_list.insert(0,e);
}
void pop()
{
if(m_list.length()>0)
{
m_list.remove(0);
}
else
{
THROW_EXCEPTION(InvalidOperationException,"...");
}
}
T top() const
{
if(m_list.length()>0)
{
return m_list.get(0);
}
else
{
THROW_EXCEPTION(InvalidOperationException,"...");
}
}
void clear()
{
m_list.clear();
}
int size() const
{
return m_list.length();
}
};
}
一.順序隊(duì)列的實(shí)現(xiàn)
A.隊(duì)列的特性
1.先進(jìn)先出
2.隊(duì)列是一種特殊的線性表
3.隊(duì)列僅能在線性表的兩端進(jìn)行操作
a.隊(duì)頭:取出數(shù)據(jù)元素的一端
b.隊(duì)尾:插入數(shù)據(jù)元素的一端
B.隊(duì)列的操作
1.創(chuàng)建隊(duì)列
2.銷(xiāo)毀隊(duì)列
3.情空隊(duì)列
4.進(jìn)隊(duì)列
5.出隊(duì)列
6.獲取隊(duì)頭元素
7.獲取隊(duì)列的長(zhǎng)度
C.隊(duì)列的實(shí)現(xiàn)
template <typename T>
class Queue:public Object
{
public:
virtual void add(const T&e)=0;
virtual void remove()=0;
virtual T front()const=0;
virtual void clear()=0;
virtual int length()const=0;
};
隊(duì)列的順序?qū)崿F(xiàn)
D.StaticQueue設(shè)計(jì)要點(diǎn)
類(lèi)模板
1.使用原生數(shù)組作為隊(duì)列的存儲(chǔ)空間
2.使用模板參數(shù)決定隊(duì)列的大容量
template<typename T,int N>
class StaticQueue:public Queue<T>
{
protected:
T m_space[N];//隊(duì)列存儲(chǔ)空間
int m_front;//隊(duì)頭元素
int m_rear;//隊(duì)尾元素
int m_length;//隊(duì)列的長(zhǎng)度
public:
StaticQueue();//初始化成員變量
int capacity()const;
//....
StaticQueue實(shí)現(xiàn)要點(diǎn)(循環(huán)計(jì)數(shù)法)
1.關(guān)鍵操作
進(jìn)隊(duì)列:m_space[m_rear]=e;m_rear=(m_rear+1)%N
出隊(duì)列:m_front=(m_front+1)%N
2.隊(duì)列的狀態(tài)
隊(duì)空:(m_length==0)&&(m_front==m_rear)
隊(duì)滿(mǎn):(m_length==N)&&(m_front==m_rear)
實(shí)現(xiàn)代碼如下:
#include "Queue.h"
#include "Exception.h"
//根據(jù)存儲(chǔ)空間的分配方式可以分為使用原生數(shù)組實(shí)現(xiàn)的靜態(tài)隊(duì)列和使用動(dòng)態(tài)分配的堆空間實(shí)現(xiàn)的動(dòng)態(tài)隊(duì)列。
namespace MyLib
{
template <typename T,int N>
class StaticQueue:public Queue<T>
{
protected:
T m_space[N];//隊(duì)列的存儲(chǔ)空間
int m_front;//隊(duì)頭元素的標(biāo)識(shí)
int m_rear;//隊(duì)尾元素的標(biāo)識(shí)
int m_length;//隊(duì)列長(zhǎng)度
public:
StaticQueue()
{//初始化成員為0
m_length=0;
m_front=0;
m_rear=0;
//m_space[N]=0;
}
int capacity()const
{
return N;
}
void add(const T&e)
{
if(m_length<N)
{
m_space[m_rear]=e;
m_rear=(m_rear+1)%N;
m_length++;
}
else
{
THROW_EXCEPTION(InvalidOperationException,"...");
}
}
void remove()
{
if(m_length>0)
{
m_front=(m_front+1)%N;
m_length--;
}
else
{
THROW_EXCEPTION(InvalidOperationException,"...");
}
}
T front()const
{
if(m_length>0)
{
return m_space[m_front];
}
else
{
THROW_EXCEPTION(InvalidOperationException,"...");
}
}
void clear()
{
m_front=0;
m_rear=0;
m_length=0;
}
int length()const
{
return m_length;
}
};
}
二.隊(duì)列的鏈?zhǔn)酱鎯?chǔ)實(shí)現(xiàn)
A.鏈?zhǔn)疥?duì)列的設(shè)計(jì)要點(diǎn)
1.類(lèi)模板,抽象父類(lèi)Queue的直接子類(lèi)
2.在內(nèi)部使用鏈?zhǔn)浇Y(jié)構(gòu)實(shí)現(xiàn)元素的存儲(chǔ)
3.只在鏈表的頭部和尾部進(jìn)程操作
完整的實(shí)現(xiàn)代碼如下
#include "Queue.h"
#include "LinkList.h"
#include <iostream>
using namespace std;
namespace MyLib
{
template<typename T>
class LinkQueue:public Queue<T>
{
protected:
LinkList<T>m_list;
public:
LinkQueue()
{
}
void add(const T&e)
{
m_list.insert(e);
}
void remove()
{
if(m_list.length()>0)
{
m_list.remove(0);
}
else
{
THROW_EXCEPTION(InvalidOperationException,"...");
}
}
T front() const
{
if(m_list.length()>0)
{
return m_list.get(0);
}
else
{
THROW_EXCEPTION(InvalidOperationException,"...");
}
}
void clear()
{
m_list.clear();
}
int length() const
{
return m_list.length();
}
};
}
小結(jié):
1.棧是一種特殊的線性表
2.棧只允許在線性表的一端進(jìn)行操作
3.StaticStack使用原生數(shù)組作為內(nèi)部存儲(chǔ)空間
4.StaticStack的大容量由模板參數(shù)決定
5.鏈?zhǔn)綏5膶?shí)現(xiàn)組合使用了單鏈表的對(duì)象
6.在單鏈表的頭部進(jìn)行操作能夠?qū)崿F(xiàn)高效的入棧和出棧操作
7.是一種特殊的線性表,具有先進(jìn)先出的特性
8.隊(duì)列只允許在線性表的兩端進(jìn)行操作,一端進(jìn),一端出
9.StaticQueue使用原生數(shù)組作為內(nèi)部存儲(chǔ)空間
10.StaticQueue的大容量由模板參數(shù)決定
11.StaticQueue采用循環(huán)計(jì)數(shù)法提高隊(duì)列操作的效率
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。
分享題目:數(shù)據(jù)結(jié)構(gòu)--棧與隊(duì)列-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://muchs.cn/article36/ddpepg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、電子商務(wù)、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、微信公眾號(hào)、全網(wǎng)營(yíng)銷(xiāo)推廣、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)