<数据结构>动态栈基本功能实现


前言

提示:本篇主要是本小白大学期间对数据结构实验的一些基本代码功能实现,希望对一同数据结构的伙伴有所帮助。


提示:以下是本篇文章正文内容,下面案例可供参考

一、线性结构两种常见应用之一 —— 栈

定义:一种可以”先进后出“的存储结构
分类:静态栈	 动态栈
主要算法:出栈 压栈
应用:函数调用 中断 表达式求值 内存分配 缓存处理 迷宫算法

二、使用步骤

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");
}

总结

提示:本篇为动态栈的一些基本功能实现,对栈空间若在脑中没有模型,是不易实现该代码的,可以结合图来理解,希望您有帮助。栈结构体指向图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值