堆棧是一種後進先出的數據結構,當你從堆棧中取出一個元素的時候,你得到的是最後進入堆棧的那個元素。堆棧這種數據結構特別適用於那些由多層子任務構成的任務。
堆棧比較常見的用法有1)保存子例程中的返回地址,參數,局部變量。2)用編譯器分析語法時保存各種語法元素記號。
動態數組與鏈表的主要區別爲其隨機存取性,但因爲堆棧上的操作永遠集中在數據元素的尾部,所以使用動態數組體現不出它的優勢。隨着元素的增加,動態數組的大小總要隨之調整,這是一種很費時的操作。
typedef struct elementT{
struct elementT *next;
void *data;
}element;
int Push(element **stack,void *data);
int Pop(element **stack,void **data);
int CreateStack(element **stack)
{
*stack=NULL;
return 1;
}
//不帶頭結點
int Push(element **stack,void *data)
{
element *elem;
elem=(element *)malloc(sizeof(element));
if(!elem)
return 0; //這點非常重要
elem->data=data;
elem->next=*stack;
*stack=elem;
return 1;
}
int Pop(element **stack,void **data)
{
element *elem;
if(!(elem=*stack))
return 0;
*data=elem->data;
*stack=elem->next;
free(elem);
return 1;
}
int deleteStack(element **stack)
{
element *elem;
while(*stack)
{
elem=(*stack)->next;
free(*stack);
*stack=elem;
}
return 1;
}
構造的棧類
class Stack
{
public:
Stack();
~Stack();
void Push(void *data);
void *Pop();
protected:
typedef struct elementT{
struct elementT *next;
void *data;
}element;
element *firstE1;
};
Stack::Stack(){
firstE1=NULL;
return;
}
Stack::~Stack(){
element *elem;
while(firstE1){
elem=firstE1->next;
delete firstE1;
firstE1=elem;
}
return ;
}
void Stack::Push(void *data)
{
element *elem=new element;
elem->data=data;
elem->next=firstE1;
firstE1=elem;
return;
}
void *Stack::Pop()
{
element *popElem=firstE1;
void *data;
if(!firstE1)
throw StackError(E_EMPTY);
data=firstE1->data;
firstE1=firstE1->next;
delete popElem;
return data;
}