前言
提示:本篇主要是本小白大学期间对数据结构实验的一些基本代码功能实现,希望对一同数据结构的伙伴有所帮助。
提示:以下是本篇文章正文内容,下面案例可供参考
一、线性结构两种常见应用之一 —— 栈
定义:一种可以”先进后出“的存储结构
分类:静态栈 动态栈
主要算法:出栈 压栈
应用:函数调用 中断 表达式求值 内存分配 缓存处理 迷宫算法
二、使用步骤
1.栈基本功能
如下(示例):
void init(PSTACK PS);
void push(PSTACK PS,int val);
bool pop(PSTACK PS, int *PVal);
bool empty(PSTACK PS);
void clear(PSTACK PS);
void traverse (PSTACK PS);
2.代码功能实现
代码如下(示例):
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<malloc.h>
typedef struct Node//节点结构体
{
int data;
struct Node *pnext;
}Node,*PNode;
typedef struct Stack//包含节点结构体的结构体(创建一次)
{
PNode PTop;
PNode PBottom;
}STACK,*PSTACK;
extern void init(PSTACK PS);//初始化(使Stack与Node产生联系)
extern void push(PSTACK PS,int val);//压栈
extern bool pop(PSTACK PS, int *PVal);//出栈
extern bool empty(PSTACK PS);//判断指向节点空间是否为空
extern void clear(PSTACK PS);//销毁栈(包括空间)
extern void traverse (PSTACK PS);//遍历栈节点数据
int main()
{
PSTACK PS;//定义一个含节点结构体的结构体
PS=(PSTACK)malloc(sizeof(STACK));//创建空间
int ch;
int val=0;
int pval=0;
init(PS);
while(1)//循环执行功能操作
{
printf("input 1:push\tinput 2:pop\tinput 0:clear\n");//选择需要执行的功能
printf("plese input :");
scanf("%d",&ch);
switch(ch)
{
//1.压栈
case 1:
printf("which num did you push:");
scanf("%d",&val);//输入需要压入栈空间的数值
push(PS,val);
traverse(PS);
continue;
case 2:
pop(PS,&pval);//出栈 pval保存出栈的数据地址
traverse(PS);
printf("you pop %d\n",pval);
continue;
case 0:clear(PS);//销毁栈
printf("Game over\n");
return 0;
}
}
return 0;
}
void init(PSTACK PS)//初始化
{
PS->PTop =(PNode)malloc(sizeof(Node));//分配空间
if(PS->PTop == NULL)//判断是否分配不成功
{
perror("malloc");
exit(-1);
}
else
{
PS->PBottom = PS->PTop;
PS->PTop->pnext =NULL;//或者 PS->PBottom->pnext=NULL;
return ;
}
}
void push(PSTACK PS,int val)//压栈
{
PNode PNew=(PNode)malloc(sizeof(Node));//分配新节点空间
PNew->data =val;//数据赋给新节点数据区
PNew->pnext=PS->PTop;//栈顶指针赋给新节点的地址区 作用:新节点地址区存放上一个节点的地址--形似链表
PS->PTop=PNew;新节点作为栈顶节点
return ;
}
bool pop(PSTACK PS, int *PVal)//出栈
{
if(empty(PS))//判断栈内数据是否为空
{
return false;
}
else
{
PNode r = PS->PTop;//栈顶指针赋给r存放
*PVal = r->data;//读出数据
PS->PTop=r->pnext;//栈顶节指针下移,指向上一个数据的地址区
free(r);//释放空间
r=NULL;
return true;
}
}
bool empty(PSTACK PS)//判断是否为空
{
if(PS->PTop == PS->PBottom)//如果栈顶指针和栈底指针相等,则该栈空间存在
{
return true;
}
else {
return false ;
}
}
void traverse (PSTACK PS)//遍历
{
PNode p=PS->PTop;
while(p!=PS->PBottom)//判断是否到达栈顶
{
printf("%3d",p->data);
p=p->pnext;//栈顶指针下移,指向上一个数据的地址区
}
putchar('\n');
return ;
}
void clear(PSTACK PS)//销毁栈
{
if(empty(PS))
{
return ;
}
else
{
PNode p =PS->PTop;
PNode q=NULL;//定义临时节点
while(p!=PS->PBottom)//判断是否到达栈底
{
q=p->pnext;//栈顶指针下移,指向上一个数据的地址区
free(p);//释放空间
p=q;
}
}
printf("clear success\nThe space has been destroyed\n");
}
总结
提示:本篇为动态栈的一些基本功能实现,对栈空间若在脑中没有模型,是不易实现该代码的,可以结合图来理解,希望您有帮助。