目前我个人在数据结构的学习中,在课外主要学习郝斌老师的数据结构, 借此博文分享我的注释与拙劣的见解
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define MaxSize 100
typedef struct node
{
int data;
struct node *next;
}NODE,*PNODE;//定义一个栈结点 里面有数据域data和指针域next
//链表方式建立
typedef struct stack
{
PNODE top;
PNODE bottom;
}STACK,*PSTACK;//定义一个结点里面有栈顶指针和栈底指针
//把这两个指针绑在一个结点中
void init(PSTACK);
void push(PSTACK,int);
int traverse(PSTACK);
int main()
{
STACK S;//STACK S等价于 typedef struct stack S
//定义了一个包含栈顶栈底指针的结点S
init(&S);//要改变这个结点里面的值 就得发送他的地址
//所以声明函数中是PSTACK专门指向STACK类型结点的指针类型
push(&S,1);
push(&S,2);
traverse(&S);
return 0;
}
void init(PSTACK ps)//初始化,创建栈
//把S的地址发送给ps了 ps指向了S保存了S的地址
{
ps->top=(PNODE)malloc(sizeof(NODE));//给栈指针结点中的栈顶指针top指向动态的分配内存
if(ps->top==NULL)
{
printf("分配失败!\n");
exit(-1);
}
ps->bottom=ps->top;//让栈指针结点中的栈底指针bottom指向(top指向的动态分配的内存)
ps->top->next=NULL;//把top指向的结点的指针域清空
}
void push(PSTACK ps,int val)//压栈即入栈
{
PNODE pnew=(PNODE)malloc(sizeof(NODE));//搞一个(链表类型的)指针pnew指向动态分配的内存
pnew->data =val; //把临时变量的值赋给新结点的数据域里面
pnew->next =ps->top;//让栈顶指针当时指向的地址(即前面一个结点的地址)赋给新结点的指针域
//也就是把新结点的指针域指向栈顶指向的最后一个结点
//顺利的把新结点挂到栈的顶部
ps->top=pnew; //让栈顶指针指向刚刚压入栈的栈结点
}
int traverse(PSTACK pS)
{
PNODE p=pS->top ;//搞一个指针p让他指向和top一样的栈结点
//然后把p从栈顶往栈底方向移动 移动到了就读取栈结点的数据域
while(p!=pS->bottom )//当p没有移动到栈底的时候
{
printf("%d",p->data );//打印栈结点的值
p=p->next;//把p往下移动
}
}