STL中的棧的擴充套件 (轉)

amyz發表於2007-11-28
STL中的棧的擴充套件 (轉)[@more@]

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 s; 
 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 tmpS; //這裡使用了一個臨時棧儲存從s棧中彈出的元素
 //用來獲得位置為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 db_stack(10);
 int i=0;
 while(i<5)
 {
 db_stack.Push(db_array[i]);
 i++;
 }
 cout< cout< while(!db_stack.IsEmpty())
 {
 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章