動態棧 棧結構的鏈式實現

用鏈表形式實現棧結構的實現,棧鏈式實現可以不受空間的限制,沒有棧上限熟練限制,使用更靈活。

#include <iostream>

typedef int DataType;
enum{OK, ERROR, FAILED};

struct Node
{
	DataType data;
	Node* next;
};

typedef struct Stack
{
	Node* top;		// 棧頂指針動態維護 當top==NULL時空棧
	int length;		// 動態棧數據大小
}DStack;


// 初始化棧頂指針和數據
int InitStack(DStack& stack)
{
	stack.top = NULL;
	stack.length = 0;

	return OK;
}

// 入棧 將val壓入棧
int Push(DStack& stack, DataType val)
{
	Node* tmp = (Node*) malloc(sizeof(Node));
	if (NULL == tmp)
	{
		std::cout << "Push to stack failed~" << std::endl;
		return FAILED;
	}

	tmp->data = val;
	tmp->next = stack.top;		// 新加入的節點變成棧頂節點 就next只像舊的棧頂指針
	stack.top = tmp;			// top指向新棧頂元素
	stack.length++;
	
	return OK;
}

int DStackEmpty(DStack& stack)
{
	return stack.length == 0;
}

int DStackSize(DStack& stack)
{
	return stack.length;
}

int Pop(DStack& stack)
{
	if (DStackEmpty(stack))				// 判斷是否已經是空棧
	{
		std::cout << "POP stack is empty" << std::endl;
		return ERROR;
	}

	Node* ptr = stack.top;		// 棧頂寄存在ptr
	stack.top = ptr->next;		// 先將top指針指向下一個元素 即將變成新的棧頂
	stack.length--;

	free(ptr);					//  釋放棧頂元素 出棧成功
	ptr = NULL;
	
	return OK;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章