用链表形式实现栈结构的实现,栈链式实现可以不受空间的限制,没有栈上限熟练限制,使用更灵活。
#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;
}