2009-04-15 11:40
順序棧(seqential stack)就是用順序儲存方式儲存的棧。在下面順序棧的類定義中是用數組儲存的。用stacka[maxsize]儲存,maxsize是最大允許存放元素的個數。變數top表示棧頂部元素的位置,初始值為-1,表示棧空.
我們首先給出順序棧的抽象資料類型的描述,然後給出順序棧的類定義與實現。下面是順序棧的抽象資料類型的描述。
ADT seqstack is
Data
棧頂表示,存放棧元素組和棧元素個數的最大數
seqstack
輸入:棧元素個數的最大數
~seqstack
刪除儲存棧元素的數組
Push
輸入:要進棧的項item
前置條件:棧末滿
動作:把item壓入棧頂
輸出:無
後置條件:棧頂增加了一個新元素,棧頂指示加1
Pop
輸入:無
前置條件:棧非空
動作:彈出棧頂元素
輸出:返回棧頂元素的值
後置條件:刪除棧頂元素,棧頂指示減1
Gettop
輸入:無
前置條件:棧非空
動作:取棧頂元素值
輸出:返回棧頂資料元素
後置條件:無
Empty
輸入:無
前置條件:無
動作:檢查棧頂指示是否等於-1
輸出:棧空時返回1,否則返回0
後置條件:無
Full
輸入:無
前置條件:無
動作:檢查棧頂指示是否等於maxsize-1
輸出:棧滿時返回1,否則返回0
後置條件:無
Clear
輸入:無
前置條件:無
動作:清空棧
輸出:無
後置條件:棧頂指示為-1
End ADT seqstack
//////////////////////////////////////////////////////
/*
**=======================================
**SeqStack.h 順序棧模板類的定義及實現
**=======================================
*/
#include <iostream.h>
#include <stdlib.h>
/////////////////////////////////////////////////////////////////////////////////////
#define MAXSIZE 0xFFFF
template<class type>
class SeqStack
{
int top; //棧頂指示
type *stacka; //數組名
int maxsize; //棧最大可容納元素個數
public:
SeqStack();
SeqStack(int size);
SeqStack(type data[],int size);
virtual ~SeqStack()
{
delete []stacka;
}
void Push(const type &item); //元素item壓棧
type Pop(); //資料元素出棧,返回之
type GetTop(); //讀棧頂資料元素並返回
int Empty()const
{
return top==-1;
} //判斷棧是否為空白
int Full()const
{
return top==maxsize-1;
} //判斷棧是否為滿
void Clear()
{
top=-1;
} //清空棧
};
template<class type>
SeqStack<type>::SeqStack():
top(-1),maxsize(MAXSIZE)
{
stacka=new type[maxsize];
if(stacka==NULL){
cerr<<"動態儲存裝置分配失敗!"<<endl;
exit(1);
}
}
template<class type>
SeqStack<type>::SeqStack(int size):
top(-1),maxsize(size)
{
stacka=new type[maxsize]; //建立儲存棧的數組
if(stacka==NULL){ //分配不成功
cerr<<"動態儲存裝置分配失敗!"<<endl;
exit(1);
}
}
template<class type>
SeqStack<type>::SeqStack(type data[],int size):
top(-1),maxsize(size)
{
stacka=new type[maxsize]; //建立儲存棧的數組
if(stacka==NULL){ //分配不成功
cerr<<"動態儲存裝置分配失敗!"<<endl;
exit(1);
}
for(int i=0;i<maxsize;i++){
stacka[i]=data[i];
}
top+=maxsize;
}
template<class type>
void SeqStack<type>::Push(const type& item)
{
//若棧已滿,出錯處理;否則把元素item壓棧
if(Full()){
cerr<<"棧已滿,不能壓棧!"<<endl;
exit(1);
}
//這裡我們採用指標先移動,然後再對元素進行操作的方式
top++;
stacka[top]=item;
}
template<class type>
type SeqStack<type>::Pop()
{
if(Empty()){
cerr<<"棧已空!"<<endl;
exit(1);
}
//棧不空,取棧頂元素
type data=stacka[top];
top--;
//返回棧頂元素
return data;
}
template<class type>
type SeqStack<type>::GetTop()
{
//若棧不空,返回棧頂元素的值
if(Empty()){
cerr<<"棧空!"<<endl;
exit(1);
}
//返回棧頂元素的值
return stacka[top];
}
//////////////////////////////////////////////////////////////////////
/*
**=======================================
**main.h 主程式
**=======================================
*/
#include "SeqStack.h"
int main()
{
int data[10]={1,2,3,4,5,6,7,8,9,10};
SeqStack<int> stack(data,10);
while(!stack.Empty()){
cout<<stack.Pop()<<" ";
}
cout<<endl;
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////
輸出結果:
10 9 8 7 6 5 4 3 2 1
Press any key to continue