6、栈

news/2024/9/18 20:52:46/文章来源:https://www.cnblogs.com/xpp3/p/18416328

1、顺序栈

#include<stdio.h>
#include<malloc.h>
#include<assert.h>#define ElemType int#define STACK_INIT_SIZE 8
#define STACK_INC_SIZE  3//顺序栈的定义 
typedef struct SeqStack{ElemType *base;int       capacity;int       top;    
}SeqStack;//初始化顺序栈 
void init_SeqStack(SeqStack* st){st->base = (ElemType*)malloc(sizeof(ElemType) * STACK_INIT_SIZE);st->capacity = STACK_INIT_SIZE;/*top可为 -1 [入栈:先top++在放值 出栈: 先取值在top--] 也可为 0 [入栈:先放值在++ 出栈: 先--在放值] */st->top = 0;
}//判断栈是否已满[为真返回1 为假返回0 ] 
int isFull(SeqStack* st){return st->top >= st->capacity;
}//判断栈是否为空[为真返回1 为假返回0 ]
int isEmpty(SeqStack* st){return st->top == 0;
}int inc_stack(SeqStack* st){ElemType* newBase = (ElemType*)realloc(st->base,sizeof(ElemType) * (st->capacity + STACK_INC_SIZE));if(newBase == NULL){printf("内存空间不足,无法申请空间.\n");return 0;}st->base = newBase;st->capacity += STACK_INC_SIZE;return 1;
}//入栈
void push(SeqStack* st,ElemType e){if(isFull(st) && !inc_stack(st)){printf("栈空间已满,%d 不能入栈.\n",e);return;}//如果top为-1 =>  st->base[++st->top] = e;st->base[st->top++] = e;
}//出栈
ElemType pop(SeqStack* st){if(isEmpty(st)){printf("栈空间已空,不能出栈.\n");return;} //如果top为-1 =>  return st->base[st->top--];return st->base[--st->top]; 
} //得到栈顶元素,但不出栈
ElemType get_top(SeqStack* st){if(isEmpty(st)){printf("栈空间已空,不能出栈.\n");return;} return st->base[st->top - 1];
}//栈的长度
int length(SeqStack* st){return st->top;
} //清空栈
void clear(SeqStack* st){st->top = 0;
}//销毁栈
void destroy(SeqStack* st){free(st->base);st->capacity = st->top = 0;
} //打印栈
void show_stack(SeqStack* st){int i = st->top - 1;for(i;i >= 0;i--){printf("%d\n",st->base[i]);}printf("\n");
}
int main(){SeqStack st;init_SeqStack(&st);int i = 1;for(i;i <= 5;i++){push(&st,i);}show_stack(&st);pop(&st);show_stack(&st);return 0;
} 

2、链栈

#include<stdio.h>
#include<malloc.h>
#include<assert.h>#define ElemType inttypedef struct StackNode{ElemType data;struct StackNode* next;
}StackNode;typedef StackNode* LinkStack;//注意 这里是二级指针 
void initStack(LinkStack* st){st = NULL;
}StackNode* malloc_statckNode(ElemType e){StackNode* p = (StackNode*)malloc(sizeof(StackNode));assert(p != NULL);p->data = e;p->next = NULL;
} //入栈 
void push(LinkStack* st,ElemType e){StackNode* p = malloc_statckNode(e);if(*st == NULL){//当前栈空间为空 ,新节点直接为栈顶 *st = p;} else {//新节点指向栈顶 p->next = *st;//更换栈顶 *st = p;}
} //出栈
ElemType pop(LinkStack* st) {if(*st == NULL){printf("当前栈空间为空,不可出栈.\n"); return;}StackNode* top = *st;*st = top->next;ElemType e = top->data;free(top);return e;
}
//打印栈
void show(LinkStack* st){LinkStack s = *st;while(s != NULL){printf("%d\n",s->data);s = s->next;}printf("\n");
}
int main(){LinkStack st;//二级指针接收一级指针的地址 initStack(&st);int i = 1;for(i;i <= 5;i++){push(&st,i);}show(&st);pop(&st);show(&st);return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/798109.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内存对齐和缓冲区溢出攻击

.一、问候语 欢迎你来到我的博客! 二、什么是内存对齐计算机中内存空间都是按照字节(byte)进行划分的,所以从理论上讲对于任何类型的变量访问都可以从任意地址开始,但是在实际情况中,在访问特定类型变量的时候经常在特定的内存地址访问,所以这就需要把各种类型数据按照一定…

ARM SMMU原理与IOMMU技术(“VT-d” DMA、I/O虚拟化、内存虚拟化)

名词缩写ASID:Address Space ID 地址空间标识符 CD:Context Descriptor; 上下文描述符; CTP:Context-table pointer 上下文表指针 EPT:Extended Page Table 扩展页表 GPA:Guest Phyical Address 客人的实际地址 GVA:Guest Virtual Address 访客虚拟地址 HPA:Host…

博客园评论区头像换页更新解决方案

使用 MutationObserver 解决了评论区头像换页无法更新的问题。前言 博客园博客正文的评论区的每一条评论其实都是带用户头像链接的,因此有些博客主题利用这个链接,对评论新增了头像显示功能。 但是这部分功能只能在第一次加载页面时有效,一旦出现评论翻页、排序等操作,头像…

数学知识(初赛)

求最大公约数的技巧 利用辗转相除法,gcd(A,B)=gcd(B,A%B),就可以很快速求解。 应用:化简分数,数学题等等。原理:理解为一个长方形,然后要尽量去铺最大正方形,以满足铺满长方形。最后一个铺满长方形的那个正方形肯定是最大公约数。 如下图,这个长方形先铺一个绿色…

高等数学 2.4 隐函数及由参数方程确定的函数的导数

目录一、隐函数求导二、由参数方程所确定的函数的导数三、相关变化率 一、隐函数求导 函数 \(y = f(x)\) 表示两个变量 \(y\) 与 \(x\) 之间的对应关系,这种对应关系可以用各种不同方式表达,例如 \(y = \sin x\) ,\(y = \ln x + \sqrt{1 - x^2}\) 等。这种函数表达方式的特点…

小林coding学习笔记(内存页面置换算法)

缺页中断示意图1 在CPU里执行一条查找某个页面A的指令,首先是虚拟内存,会到虚拟内存和物理内存的映射关系的页表中查询。 2 页表中不存在需要查找的页面A的有效信息。 3 则触发缺页中断信号给操作系统,操作系统收到缺页中断信号后,就会去磁盘里面查找该页面。 4 操作系统在…

Unity中的三种渲染路径

Unity中的渲染路径 Unity的渲染路径 在Unity里,渲染路径(Rendering Path)决定了光照是如何应用到Unity Shader中的。因此,我们只有为Shader正确地选择和设置了需要的渲染路径,该shader的光照计算才可以被正确执行。 unity中的渲染路径:Forward Rendering Path (向前渲染…

白云龙期货投资-第一讲

# 期货散户投资者常见错误 抄底摸顶,进场无依据,无参照物 小赢大亏(小鸟吃食 大象拉屎资金曲线) 用错误的方法分析行情(金死叉) 过分依赖各种交易软件,公式 持亏损的单子隔夜 死扛(进场条件)期货散户投资者常见错误 抄底摸顶,进场无依据,无参照物 小赢大亏(小鸟吃食 大…

408五级流水线强化课笔记

408强化课录播五级流水线相关内容笔记指令流水线基本概念:简单的概念题 指令流水线基本实现:指令按序发射,按序完成 各种冒险:结合MIPS指令序列分析并处理冒险 超标量和动态流水线:简单的概念题五级流水线 五级流水线的设计是为了通过并行提高处理器的吞吐量。图片来自CSA…

关键字检索分析-案例2:开源代码分析

第一次拿来分析一下开源代码,上效果图代码和文件地址 具体内容参考我前面一篇博客 spring-frameworkredis, redis单个文件非常大mybatis我实话我没有看过这些源码。 之前的博客里的脚本,bug挺多的。可以以gitee这里为主(链接在最上面)。

小林coding学习笔记(进程调度算法)

//进程调度算法 进程调度算法是CPU通过进程调度算法决定某个时刻去调用哪个进程到CPU上运行的算法 1、先来先服务调度算法 每次从就绪队列的队头调度到CPU上运行,直到进程退出或被阻塞,才会继续从队列中调度进程运行。 特点:对短作业不利,对长作业有利,无法平衡短作业与长…

spring mvc详细讲解(前后端分离模式)

在前后端分离模式下,Spring MVC 的作用主要集中在处理后端的业务逻辑和 API 接口,而不再直接管理视图部分。也就是说,Spring MVC 的重点是如何处理客户端的请求并返回数据(通常以 JSON 或 XML 格式),而视图渲染交给前端框架(如 Vue.js、React 等)来完成。 下面是针对前…