• C语言用链表实现一个栈


    目前在学数据结构,所以就相当于做笔记了,希望对大家有帮助。

    栈大家都很熟悉,这里就不啰嗦了。

    在头文件中关于栈和链表的定义,整个的链表是LinkStack, 里面存储的元素top就是节点,这样分开存的好处是方便理解和后期修改

    1. #include
    2. #include
    3. #include
    4. struct LNode{
    5. int data; // 栈的数据
    6. LNode* next; // 指向下一个节点
    7. };
    8. struct LinkStack{
    9. LNode* top;
    10. int len; // 存储栈的长度
    11. int maxlen; // 栈的最大长度
    12. };

    创建一个栈,值得注意的是len之必须提前赋为-1,保证我们的maxlen数值准确,防止出现最大值是5,但是实际上只能存4个节点的情况

    1. // 创建一个栈
    2. LinkStack* Create(int maxlen){
    3. LinkStack* ls = (LinkStack*)malloc(sizeof(LinkStack));
    4. ls->top = NULL;
    5. ls->len = -1;
    6. ls->maxlen = maxlen;
    7. return ls;
    8. }

    将栈置空,直接把len修改即可,这里(偷懒)就不free了。

    1. // 将栈置空
    2. void FreeAll(LinkStack* ls){
    3. ls->len = -1;
    4. }

    断栈是否为空

    1. // 判断栈是否为空
    2. bool IsEmpty(LinkStack* ls){
    3. return ls->len <= 0;
    4. }

    判断栈是否已满

    1. // 判断栈是否已满
    2. bool IsFull(LinkStack* ls){
    3. return ls->len == ls->maxlen;
    4. }

    将数据入栈,需要注意一定是头插法,栈只有一个入口

    1. // 将x压入栈
    2. bool push(LinkStack* ls, int x){
    3. if(IsFull(ls)){
    4. printf("栈已满!");
    5. return false;
    6. }
    7. LNode* newNode = (LNode*)malloc(sizeof(LNode));
    8. newNode->data = x;
    9. newNode->next = ls->top;
    10. ls->top = newNode;
    11. ls->len++;
    12. return true;
    13. }

    将栈顶元素出栈,不能提供中间删除的方法,因为栈只有一个出口

    1. // 将栈顶元素出栈
    2. bool pop(LinkStack* ls){
    3. if(IsEmpty(ls)){
    4. printf("栈为空!");
    5. return false;
    6. }
    7. LNode* tool = ls->top;
    8. ls->top = tool->next;
    9. ls->len--;
    10. return true;
    11. }

    获取栈顶元素,这个方法可以和出栈写在一起,即出栈的时候顺便获取这个元素值

    1. // 获取栈顶元素
    2. int getTop(LinkStack* ls){
    3. return ls->top->data;
    4. }

    打印栈内的所有元素,限于单链表的原因,这里只能反过来打印,即从栈顶打印到栈底。也可以把链表换成双链表

    1. // 打印栈的所有元素
    2. void printAll(LinkStack* ls){
    3. LNode* tool = ls->top;
    4. while(tool){
    5. printf("%d ", tool->data);
    6. tool = tool->next;
    7. }
    8. }

    最后的主函数,简单测试一下。

    1. int main(){
    2. int i = 0, n = 0;
    3. LinkStack* ls = Create(5);
    4. while(i < 7){
    5. scanf("%d", &n);
    6. if(!push(ls,n)){
    7. break;
    8. }
    9. i++;
    10. }
    11. printf("\n");
    12. pop(ls);
    13. printAll(ls);
    14. return 0;
    15. }

    有什么问题可以直接私信我呀~~~~~

    希望和诸君共勉

  • 相关阅读:
    读 RocketMQ 源码,学习并发编程三大神器
    字节算法大神熬了三个通宵整理的数据结构与算法笔记(万字长文)
    1-前端基本知识-CSS
    Web酒店管理系统(附源码及资源)
    C语言,从联合看字节序
    【MySQL进阶】深入理解InnoDB记录结构
    短视频矩阵系统源码开发搭建技术解析-PHP语言
    百望云携手华为发布金融信创与数电乐企联合方案 创新金融合规变革
    linux部署校园网绕过53端口服务脚本
    yaml
  • 原文地址:https://blog.csdn.net/qq_61567032/article/details/126817888