用鏈表形式實現棧結構的實現,棧鏈式實現可以不受空間的限制,沒有棧上限熟練限制,使用更靈活。
#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;
}