数据结构 的学习视频 https://www.bilibili.com/video/av6159200?from=search&seid=6709590585276522157
一 算法:
栈: 数据进出,类向箱子放东西和拿东西,先进后出,或者说后进先出。栈分为静态栈和动态栈两种,静态栈用数组实现,
动态栈用链表实现。算法 出栈 入栈(压栈),遍历,清空。
1.创建栈
栈包括栈顶指针和栈底指针。 栈顶指针存放,栈顶元素地址,栈底指针存放栈底元素地址。
typedef struct Stack
{
PNODE pTop;//栈顶指针
PNODE pBottom;//栈底指针
} STACK,* PSTACK;
2.入栈
入栈分为三步。第一新建一个节点。第二步,新建节点的指针域指向栈顶。第三步将栈顶指向新建节点。
void push(PSTACK pS,int val )
{
PNODE pNew=(PNODE)malloc (sizeof (NODE));
pNew->data=val;
pNew->pNext= pS->pTop;//新建节点指针域指向栈顶值 ,不能写pS->butttom;
pS->pTop = pNew ; //更新栈顶指针 ,指向新节点
return;
}
3.出栈
- 创建一个数据节点的指针,保存栈顶地址。2然后栈顶指针指向栈顶的下一位置的地址
3.释放栈顶
void push(PSTACK pS,int val )
{
PNODE pNew=(PNODE)malloc (sizeof (NODE));
pNew->data=val;
pNew->pNext= pS->pTop;//新建节点指针域指向栈顶值 ,不能写pS->butttom;
pS->pTop = pNew ; //更新栈顶指针 ,指向新节点
return;
}
4.创建两个指针p,q,一个指向栈顶,一个指向栈顶的下一位置。滑动清空
只是删除数据元素,表还在。
void clear(PSTACK pS)
{
if(empty(pS))
{ return ;
}
else
{
PNODE p=pS->pTop;
PNODE q=NULL;
while(p!=pS->pBottom) //往下滑动删除
{
q=p->pNext;//q指向下一个节点
free(p);
p=q;//更新
}
pS->pTop=pS->pBottom;//清空完成
}
}
二 程序
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(PSTACK);//需要传入结构体指针 ,否则不改变结构体内元素的值
void push(PSTACK ,int);//第一个参数 向那个栈中压入元素,第二个是要压得值
void traverse(PSTACK);//传入参数是栈指针
bool pop(PSTACK,int *);//出栈
void clear(PSTACK pS);//清空栈
bool empty(PSTACK pS);//栈是否为空
int main()
{
STACK S;//STACK
int a;
init(&S);//造出一个空栈
push(&S,1);//压元素
push(&S,2); //压元素
push(&S,3); //压元素
push(&S,4); //压元素
push(&S,5); //压元素
push(&S,6); //压元素
traverse(&S);//遍历
if(pop(&S,&a)) //进行一次出栈
{
printf("出栈成功,出栈的元素是%d\n",a);
}
else
{
printf("出栈失败\n");
}
traverse(&S);//遍历
clear(&S);//清空栈
if(empty(&S))
{
printf("栈被清空\n");
}
return 0;
}
void push(PSTACK pS,int val )
{
PNODE pNew=(PNODE)malloc (sizeof (NODE));
pNew->data=val;
pNew->pNext= pS->pTop;//新建节点指针域指向栈顶值 ,不能写pS->butttom;
pS->pTop = pNew ; //更新栈顶指针 ,指向新节点
return;
}
/*造出一个空栈
*/
void init (PSTACK pS) //S的地址付给pS
{
pS->pTop=(PNODE)malloc(sizeof(NODE));
if (NULL==pS->pTop)
{
printf("动态内存分配失败!\n");
exit(-1);
}
pS->pBottom=pS->pTop;//指向第一个节点
pS->pTop->pNext=NULL;// pS->pBottom->pNext=NULL清空指针区域
}
/*遍历栈*/
void traverse(PSTACK pS)
{
PNODE p=pS->pTop; //找人先找地址,即找数据先找指针。
while(p!=pS->pBottom)
{
printf("%d ",p->data);
p=p->pNext;
}
printf("\n");
return ;
}
bool empty(PSTACK pS)
{ if (pS->pTop==pS->pBottom)
return true;
else
return false;
}
/*把pS所指向的栈出栈一次,并把出栈的元素存入pVal
形参所指向的变量中,如果出栈失败,则返回false; */
bool pop(PSTACK pS,int *pVal)
{
if(empty(pS)) //栈空出栈失败,不能写成&pS,pS存放的本身就是s的地址
{
return false;
}
else
{
PNODE r=pS->pTop;
*pVal= r->data;
pS->pTop=r->pNext;//和下句的free次序不能变,变得化,会找不到栈顶。
free(r);
r=NULL;
return true;
}
}
//只是删除数据元素,表还在。
void clear(PSTACK pS)
{
if(empty(pS))
{ return ;
}
else
{
PNODE p=pS->pTop;
PNODE q=NULL;
while(p!=pS->pBottom) //往下滑动删除
{
q=p->pNext;//q指向下一个节点
free(p);
p=q;//更新
}
pS->pTop=pS->pBottom;//清空完成
三 程序的运行结果