链栈:
栈中元素的数目变化较大或不清楚栈元素的数目,可考虑使用链式存储结构
实现形式:无头结点的单链表,栈名指针指向栈顶元素
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
#define OK 1
#define ERROR -1
#define OVERFLOW -1
typedef int Status;
typedef int SElemType;
typedef struct StackNode{
SElemType data;
struct StackNode * next;
}SNode, *LinkStack;
Status InitStack(LinkStack& S){
S = NULL;
}
Status DestroyStack(LinkStack& S){ // O(n)
SNode * p = S;
while(p){
free(p);
p = NULL;
}
return OK;
}
Status Push(LinkStack& S, SElemType e){
// 将元素e插入到栈S的顶部 开辟新结点
SNode * p = new SNode;
p->data = e;
p->next = S;
S = p;
}
Status Pop(LinkStack& S, SElemType& e){
if(S == NULL)
return ERROR;
e = S->data;
SNode * p = S;
S = S->next;
free(p);
p = NULL;
}
Status StackEmpty(LinkStack S){
if(S == NULL)
return true;
return false;
}
int StackLength(LinkStack S){ // O(n)
int len = 0;
SNode * p = S;
while(p){
p = p->next;
len++;
}
return len;
}
Status GetTop(LinkStack S, SElemType& e){
if(S == NULL)
return ERROR;
e = S->data;
return OK;
}
Status Visit(SNode *p){
printf("%d ", p->data);
return OK;
}
Status StackTraverse(LinkStack S, Status (*Visit)(SNode*)){ // O(n)
SNode * p = S;
while(p){
Visit(p);
p = p->next;
}
return OK;
}
int main()
{
SElemType e;
scanf("%d", &e);
LinkStack S;
InitStack(S); // 初始化栈
Push(S, e); // 插入元素
Pop(S, e); // 弹出元素
StackEmpty(S); // 判断栈空
StackLength(S); // 求栈长
GetTop(S, e); // 取栈顶
StackTraverse(S, Visit);
DestroyStack(S); // 销毁栈
return 0;
}