首页 > 其他分享 >模拟栈

模拟栈

时间:2023-09-10 22:33:44浏览次数:32  
标签:ps 结点 PNODE pBottom pTop 模拟 指针


 #include<stdio.h>
  #include<malloc.h>
 #include<stdlib.h>
  //模拟栈的功能
  
  //自定义数据类型 
 typedef struct Node//节点类型 
  {
  	int data;//存放的数据
	struct Node *pNext;//下一个结点的地址	   
  } NODE,*PNODE;//将数据类型起别名 
  
 typedef struct Stack//栈类型 
  {
  	PNODE pTop;//栈顶指针 
  	PNODE pBottom;//栈底指针 
  }STACK,*PSTACK; 
  
  //初始化栈 
  void init(PSTACK ps)
  {
  	/*
  	思想:让栈底和栈顶指针同时指向头结点 
  	*/
  	ps->pBottom = (PNODE)malloc(sizeof(NODE));//创建头结点并赋值给栈底指针
	  if(NULL==ps->pBottom)
	  {
	  	 printf("动态内容分配失败");
	  	 exit(-1);//内存分配失败直接退出 
	   }else{
	   		ps->pTop = ps->pBottom;
	   		ps->pBottom->pNext=NULL;
	   } 
  }
  
  //压栈 
  void push(PSTACK ps,int value)
  {
  	//思想:我们直接将栈顶指针指向新结点即可 
  	PNODE p =(PNODE)malloc(sizeof(NODE));//创建结点
	  if(NULL == p)
	  {
	  	printf("动态内容分配失败");
	  	exit(-1);//内存分配失败直接退出程序 
	   } else{
	   	    p->data=value;//给新结点赋值 
	   	    p->pNext =ps->pTop;//新结点的指针指向前一个结点 
	   		ps->pTop = p;//栈顶指针指向新结点 
	   		
	   }
  }
  
  //判断栈是否为空
  int empty(PSTACK ps) 
  {
  	if(ps->pBottom == ps->pTop)
	  {
	  	return 1;
		  }	else{
		  	return 0;
		  }
  }
  
 //出栈
 int pop(PSTACK ps,int *value)
 //将栈顶结点删除,并将删除结点的值返回 
 
 {
 	if(empty(ps))//当栈为空 
 	{
 		printf("栈为空");
 		return 0;
	 }else{//栈非空进行出栈操作 
	 	PNODE r = ps->pTop;
	 	ps->pTop = r->pNext;//将栈顶下移
		 free(r);//将出栈的结点内存释放掉 
		 r=NULL;
		 return 1; 
	 }
  } 
  
  void show(PSTACK ps)//展示输出栈的内容 
  {
  PNODE p = ps->pTop;
        while(p!=ps->pBottom)
        {
        	 	  printf("%d     ",p->data);
        	 	  p=p->pNext;
		}
	 
	   
    
  }
  //清空栈(恢复到空栈的情形)
  void clear(PSTACK ps)
  {
  	//思路:1.将栈中所有的结点的内存都释放掉
	 //  2.将栈顶指针指向头结点 
	 /*
	 按照道理说:我们需要定义q p两个遍历指针才行
	 因为我们free(p)后,p所指向的结点都不存在了,那么里面的pNext都不存在了,但是好像还是可以
	 应该是不熟悉free方法的底层原理 
	 */
	 
	 
	 if(empty(ps))
	 {
	 	return;//为空则直接截至 
	 }else{
	 	PNODE p = ps->pTop;//定义一个遍历指针
	 	PNODE q = NULL;//定义遍历指针q 
	 while(p!=ps->pBottom)
	 {  q=p->pNext;
		free(p);
		  p=q;
	  } 
	  ps->pTop = ps->pBottom;//栈顶和栈底都指向头结点 
	 }
	  	
   } 
  int main()
  {
  	STACK s;//定义一个栈
	init(&s);//初始化栈  
  	push(&s,8);
  	push(&s,9);
	clear(&s);
 	show(&s);
  	
  	
  	
  	
  	return 0;
   } 

标签:ps,结点,PNODE,pBottom,pTop,模拟,指针
From: https://www.cnblogs.com/swtaa/p/17692165.html

相关文章

  • 【考后总结】9 月 CSP-S 模拟赛 2
    9.10CSP模拟34T1斐波那契数由于边权只有\(\{0,1\}\),因此生成树的边权和取值连续,求出最小和最大判断即可。点击查看代码intt;intn,m;structedge{intu,v,w;edge()=default;edge(intu_,intv_,intw_):u(u_),v(v_),w(w_){}}e[maxn];intbel[maxn......
  • monkey解决adb devices识别不到夜神模拟器问题
    一、输入命令检测不到,确认夜神模拟器是否开启了调试模式 二、如果夜神模拟器已经打开调试模式了,但使用adbdevices还是找不到设备,可以输入adbconnect127.0.0.1:62001连接上夜神模拟器(62001为夜神模拟器的端口号)。但此方法只适用当前会话,想要从根本上解决见下面方法。三、sdk......
  • 9.9模拟总结
    模拟赛笔G总体上:这一次考试真的是dp专场,我全部打的暴力部分分,难受的一批!主要是我个人的dp能力太薄弱了......个体上:第一题:在考场上我的状态设计的很正确,但是没有想出正解,也没有想到过单调队列优化这些事。总结:dp的优化除了直接时间上优化,还可以通过减少状态数来优化。就......
  • CSP 2020 第一轮(初赛)模拟解析
    一、十进制数\(114\)的相反数的\(8\)位二进制补码是:A.\(10001110\)$\\\\\$B.\(10001101\) $\\\\\$C.\(01110010\) $\\\\\$D.\(01110011\)点击查看答案根据原码补码反码的有关定义可得:-114的源码为:01110010反码为:10001101......
  • 数组模拟链表 模拟栈和队列 单调栈和队列(9/7 9/8)
    单链表数组模拟链表可以加快速度,更利于优化算法#include<iostream>usingnamespacestd;constintN=100010;inte[N],ne[N],head,idx;voidinit(){head=-1;idx=0;}voidadd_head(intx){e[idx]=x;ne[idx]=head;head=idx++;}void......
  • 记PE文件结构实验,模拟文件内存加载过程。
    记录文件结构试验前言:使用的模拟程序是notepad.exe,主要记录其中的思路和遇到其中的困难。实验目的:模拟内存加载PE文件的过程,将每个区段模拟加载到内存之中。根据文件结构中头表中的信息,读取并sekk指针到Segment头。然后循环遍历Segment头将内容加载到VirtualAddress中,主要目的......
  • DHCP饿死攻击及防御(基于ENSP模拟器、Kali攻击机实现)
    相关参数:·Kali攻击机一台·ENSP模拟器 拓扑图:   实验说明:·通过配置DHCP_Server,使得192.168.150.0/24子网内的终端能够自动获取IP地址及DNS·通过配置SW交换机,开启DHCPSnooping功能,用于保证DHCP客户端从合法的DHCP服务器获取IP地址·Kali攻......
  • python模拟用户登录
    python模拟用户登录目录python模拟用户登录一、授权认证二、Cookie认证一、授权认证1、HTTP基础认证importrequestsfromrequests.authimportHTTPBasicAuthurl="https://xxx.xxx.xxx/"username="admin"password="admin"#HTTP基础认证response=requests.ge......
  • wzOI 2023.8.24 模拟赛(附树的直径和三分法)
    2023-08-2815:53:53$$A$$典型错误一知半解看样例型:如果该队某个数组的值比最大值大就算入答案。上第一次厕所前我的思路:开局\(30\)分钟。显然,我并不需要有一个数值最大才能赢,我只需要其中一个数值比其中一个数值比其中一个数值最大的那个要大的队要大即有可能获胜......
  • 暑假集训 Day17 模拟赛题解
    2023-08-0318:18:03前言好家伙,很少完整订正一场比赛,可能是因为这个比赛相对来说确实不难吧(至少正解不难)。总结与反思这场比赛其实没有我想象的那么难,只是觉得题目可能不简单,就没有往简单的思路想,反而是被之前讲过的题疑惑,以为要用到一些很奇特的算法,结果打完以后看了题解再结......