STL中的棧的擴充套件 (轉)
C++標準模版庫中的棧模版類提供了一些方法可以對棧進行簡單的操作,其中提供的方法如下:
bool empty( ) const;
檢視棧是否為空,如果為空返回true,否則返回false。
void pop( );
彈出位於棧頂的,棧中的物件個數減一。不返回任何值。
void push(const Type& _Val);
將Type型別的值_Val壓進棧,棧中的物件個數加一。不返回任何值。
size_type size( ) const;
返回棧的大小,即棧中物件的個數。其中size_type是一個unsigned size型別。
value_type& top( );
const value_type& top( ) const;
返回位於棧頂的物件,不修改棧中的物件。
大家可以看到,標準庫中棧類提供的方法很有限,而且不能限定棧的大小,而且在對空棧進行pop操作時因沒有采取防範措施會導致應用崩潰,這是很不的,因此在擴充套件棧模版類時我會在構造中指定棧中能夠盛放最大物件個數。透過參考類庫,為方便對棧的操作,可以為棧新增如RemoveAll()、ElementAt()等方法。重新定義的方法如下:
bool Push(T i);
如果棧未滿,即棧中的物件個數小於棧的大小,則將物件i壓進棧,並返回true;如果棧已滿,不任何操作,返回false。其中T為i的資料型別,下同。
T Pop();
如果棧為非空,彈出位於棧頂的物件,棧中的物件個數減一。返回彈出的物件。
T Peek();
如果棧為非空,返回位於棧頂的物件,不修改棧中的物件。其功能和原來stack的top()方法相同。
void RemoveAll();
彈出棧中所有的物件,即將棧清空。
bool IsEmpty();
檢視棧是否為空,如果為空返回true,否則返回false。其功能和原來stack的empty()方法相同。
T ElementAt(int i);
返回位於棧中第i個物件,此物件的位置從棧底算起。
unsigned int Size();
返回棧的大小,即棧中物件的個數。
bool SetMaxSize(unsigned int mSize);
如果當前棧中物件的個數設定棧的大小,即設定棧能夠盛放的最大物件的個數,並返回true。否則返回false。
基於以上提供的棧方法,我使用了斷言(assert)來判斷當前操作的合法性,如不能對空棧執行pop操作,如果進行pop操作則產生一個異常(是abnormal,它與exception不同,abnormal的產生是由assert後的布林為假產生的,並不是執行時的錯誤)。擴充套件後的棧模版類的程式碼如下:
//*********Stack.h***********
//*******Code: hifrog********
#include
#include
using namespace std;
template
class Stack
{
private:
stack
unsigned int MaxSize;
public:
Stack(unsigned int mSize)
{
MaxSize=mSize;
}
bool Push(T i)
{
if(Size()
s.push(i);
return true;
}
return false;
}
T Pop()
{
T tmp=0;
assert(!s.empty());
tmp=s.top();
s.pop();
return tmp;
}
T Peek()
{
assert(!s.empty());
return s.top();
}
void RemoveAll()
{
while(!s.empty())
s.pop();
}
bool IsEmpty()
{
return s.empty();
}
T ElementAt(int i)
{
assert(i>0&&i<=Size());
int tmp=(int)s.size();
T value=0;
stack
//用來獲得位置為i的元素的值
for(int k=tmp;k>i;k--)
{
tmpS.push(s.top());
assert(!s.empty());
s.pop();
}
assert(!s.empty());
value=s.top();
for(int j=tmp;j>i;j--)
//向s棧回填彈出的元素
{
s.push(tmpS.top());
assert(!s.empty());
tmpS.pop();
}
return value;
}
unsigned int Size()
{
return (unsigned int)s.size();
}
bool SetMaxSize(unsigned int mSize)
{
if(mSize>Size())
{
MaxSize=mSize;
return true;
}
return false;
}
};
而且寫了一個測試程式:
#include "Stack.h"
//#include
#include
using namespace std;
int main()
{
double _array[]=
{
1.1,2.2,3.3,4.4,5.5
};
Stack
int i=0;
while(i<5)
{
db_stack.Push(db_array[i]);
i++;
}
cout<
{
cout<
//db_stack.Pop();
return 0;
}
執行結果如下:
5
2.2
5.5
4.4
3.3
2.2
1.1
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-985641/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 擴充套件你的STRUTS (轉)套件
- 擴充套件Linux網路棧套件Linux
- sql中的擴充套件學習SQL套件
- 擴充套件實現Unity協程的完整棧跟蹤套件Unity
- C#中的擴充套件類的理解C#套件
- shell中擴充套件命令套件
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- ?用Chrome擴充套件管理器, 管理你的擴充套件Chrome套件
- OpenGL 1.3 最新擴充套件 (轉)套件
- 正則的擴充套件套件
- SRAM的容量擴充套件套件
- MySQL中InnoDB引擎對索引的擴充套件MySql索引套件
- PHP擴充套件開發就是一個自己的PHP擴充套件PHP套件
- 表空間自動擴充套件 AUTOALLOCATE 的擴充套件規律套件
- 構建可擴充套件的應用(一) (轉)套件
- 編寫自己的php擴充套件函式 (轉)PHP套件函式
- Linux 核心使用的 GNU C 擴充套件(轉)Linux套件
- WCF擴充套件:行為擴充套件Behavior Extension套件
- PHPWAMP安裝Redis擴充套件的方式與相關擴充套件的下載PHPRedis套件
- .NET: 談談C#中的擴充套件方法C#套件
- 聊聊Spring中的那些擴充套件機制Spring套件
- Spring 中的 XML schema 擴充套件機制SpringXML套件
- 學習PHP中YAML操作擴充套件的使用PHPYAML套件
- Java 中模擬 C# 的擴充套件方法JavaC#套件
- lv擴充套件過程中遇到的錯誤套件
- gcc核心擴充套件linuxforum(轉)GC套件Linux
- C#中的this擴充套件方法與javascript中的prototype方法C#套件JavaScript
- TLS擴充套件的那些事TLS套件
- MySQL InnoDB的索引擴充套件MySql索引套件
- DLR 的擴充套件庫 Dynamitey套件MIT
- 擴充套件你的KUBECTL功能套件
- 04.字串的擴充套件字串套件
- 服務的擴充套件性套件
- YouTube的架構擴充套件架構套件
- Chrome瀏覽器擴充套件開發系列之十七:擴充套件中可用的chrome.events APIChrome瀏覽器套件API
- [擴充套件推薦]簡體轉繁體/繁體轉簡體 OpenCC-PHP 擴充套件套件PHP
- 【Kotlin】擴充套件屬性、擴充套件函式Kotlin套件函式
- PHP 容器中安裝原始碼包中的擴充套件PHP原始碼套件