动态栈本质上就是一个操作受限的链表。
栈的结构由两部分组成,一个是包含了顶部指针和底部指针的结构体
另一个就是链表
顶部指针(p->pNext)指向的是栈顶的有效结点,底部指针指向的是头结点(数据域不存放有效数据)
此链表和普通的单链表不同的是为了更好地实现栈地各种操作,我们是由栈顶元素以此指向栈底元素。
下面代码包括了初始化,入栈,出栈,遍历,判断是否为空,和返回有效长度的操作。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct Node//创立结点的结构,包含数据域和指针域
{
int data;
struct Node * pNext;
}NODE,*PNODE;
typedef struct stack//创立栈的结构 , 包含一个底部指针和一个顶部指针
{
PNODE pTop;
PNODE pBottom;
}STACK,*PSTACK;
void init_stack(PSTACK);//栈初始化
void en_stack(PSTACK,int);//入栈
void out_stack(PSTACK);//出栈
int isempty(PSTACK );//判断是否为空
int len(PSTACK);//返回栈的长度
void traverse(PSTACK);//遍历
int main(void)
{
STACK st;
init_stack(&st);
en_stack(&st,1);
en_stack(&st,2);
en_stack(&st,3);
en_stack(&st,4);
en_stack(&st,6);
traverse(&st);
printf("%d\n",len(&st));
out_stack(&st);
traverse(&st);
}
void init_stack(PSTACK st)
{
st->pBottom = (PNODE)malloc(sizeof(NODE));//栈的底指针指向栈底元素(头节点)
if(st->pBottom == NULL)
{
printf("分配内存失败\n");
exit(-1);
}
else
{
st->pTop = st->pBottom;
st->pTop->pNext = NULL;
}
}
void en_stack(PSTACK st,int val)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(pNew == NULL)
{
printf("分配内存失败\n");
exit(-1);
}
else
{
pNew->pNext=st->pTop;
st->pTop = pNew;
st->pTop->data = val;
}
}
void out_stack(PSTACK st)
{
if(isempty(st))
{
printf("此栈为空无法出栈!\n");
}
PNODE p = st->pTop;
st->pTop = st->pTop->pNext;
free(p);
}
int isempty(PSTACK st)
{
if(st->pTop == st->pBottom)
{
return 1;
}
else
{
return 0;
}
}
int len(PSTACK st)
{
int len = 0;
PNODE p = st->pTop;
while(p->pNext != NULL)
{
len++;
p = p->pNext;
}
return len;
}
void traverse(PSTACK st)
{
PNODE p = st->pTop;
while(p->pNext!=NULL)
{
printf("%d ",p->data);
p = p->pNext;
}
printf("\n");
}