關於堆棧

堆棧是一種後進先出的數據結構,當你從堆棧中取出一個元素的時候,你得到的是最後進入堆棧的那個元素。堆棧這種數據結構特別適用於那些由多層子任務構成的任務。

堆棧比較常見的用法有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;
}




發佈了40 篇原創文章 · 獲贊 4 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章