C语言中栈的两种实现方法

C语言中栈是一种常用的数据结构,常用于程序中的内存管理、函数调用等场景。在C语言中,栈的实现方法主要有两种:数组实现和链表实现。

数组实现

数组实现是一种简单、直接、易于理解和操作的方式。栈的数组实现要求开辟一段连续的内存空间,容量为栈的最大大小,在程序运行时空间大小固定,但在使用时效率高,适合空间比较紧张的场景。

下面是一个数组实现的栈结构的示意代码:

#define MAX_SIZE 10 // 定义栈的最大大小为10
int stack[MAX_SIZE];
int top = -1; // 栈顶指针初始化为-1

void push(int data){
    if(top < MAX_SIZE - 1){ // 判断栈满
        stack[++top] = data; // top指针加1,将元素压栈
    }
}

int pop(){
    if(top >= 0){ // 判断栈空
        return stack[top--]; // 返回栈顶元素,并将top指针减1
    }
}

在这段代码中,我们首先使用#define指令定义栈的最大大小为10,然后定义整型数组stack,用于存储栈的元素。top变量表示栈顶指针,初始化为-1,表示栈为空。在push操作中,我们首先判断栈是否已满,如果未满则将元素压入栈中,并将栈顶指针加1;在pop操作中,我们首先判断栈是否为空,如果非空则返回栈顶元素,并将栈顶指针减1。下面是一个使用数组实现的栈结构的示例代码:

#include <stdio.h>

int main(){
    push(1); // 压入元素1
    push(2); // 压入元素2
    printf("%d\n", pop()); // 弹出元素2
    printf("%d\n", pop()); // 弹出元素1
    return 0;
}

链表实现

链表实现是一种更加灵活、动态的方式。相较于数组实现,链表实现的空间大小可以灵活变化,不需要在程序开始时就确定大小;而且链表实现可以进行插入、删除等操作,比起数组实现更加灵活。

下面是一个链表实现的栈结构的示意代码:

struct StackNode {
    int data;
    struct StackNode *next;
};

struct StackNode *top = NULL; // 栈顶指针初始化为空

void push(int data) {
    struct StackNode *newNode = (struct StackNode*)malloc(sizeof(struct StackNode)); // 动态创建一个栈节点
    newNode->data = data;
    newNode->next = top; // 将新节点的next指针指向当前栈顶节点
    top = newNode; // 将新节点赋值给栈顶指针
}

int pop() {
    if (top == NULL) return -1; // 栈空
    int data = top->data; // 保存栈顶元素
    struct StackNode *temp = top; // 保存栈顶节点
    top = top->next; // 将栈顶指针下移一位
    free(temp); // 释放栈顶节点
    return data; // 返回栈顶元素
}

在这段代码中,我们首先定义了一个结构体StackNode,用于表示一个栈节点。节点中包含data变量(用于存储节点的数据)和next指针(用于指向下一个节点)。top变量表示栈顶指针,初始化为空。在push操作中,我们首先使用malloc函数动态创建一个新的栈节点,然后将新节点的next指针指向当前栈顶节点,将新节点赋值给栈顶指针;在pop操作中,我们首先判断栈是否为空,如果非空则保存栈顶元素并弹出栈顶节点。下面是一个使用链表实现的栈结构的示例代码:

#include <stdio.h>

int main(){
    push(1); // 压入元素1
    push(2); // 压入元素2
    printf("%d\n", pop()); // 弹出元素2
    printf("%d\n", pop()); // 弹出元素1
    return 0;
}

以上就是C语言中栈的两种实现方法的详细讲解和示例代码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言中栈的两种实现方法 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C语言实现简单的推箱子小游戏

    C语言实现简单的推箱子小游戏攻略 简介 推箱子游戏是一种经典的益智类小游戏。本攻略将介绍如何使用C语言实现简单的推箱子游戏。 程序大致流程 定义地图,使用数组保存地图信息。 根据地图信息输出地图。 玩家输入移动命令,判断是否合法。 移动箱子,更新地图信息。 输出更新后的地图。 判断是否通关。 如过关,输出相应信息,游戏结束。 程序具体实现 定义地图 首先要定…

    C 2023年5月23日
    00
  • 如何用C++求两个数的最大公约数和最小公倍数

    我们可以使用以下两种方法求出两个数的最大公约数(Greatest Common Divisor, GCD)和最小公倍数(Least Common Multiple, LCM)。 方法一:欧几里得算法 欧几里得算法又称辗转相除法,基本原理是:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。 对于两个正整数a、b(a>b)我们有: $gcd…

    C 2023年5月23日
    00
  • C语言编程银行ATM存取款系统实现源码

    C语言编程银行ATM存取款系统实现源码攻略 背景介绍 随着现金支付逐渐落后于时代的步伐,银行ATM机成为了人们日常生活中不可或缺的一部分。银行ATM机内置了众多功能,例如可以查询余额、转账、存取款等,其中存取款是最为基本且常用的功能。 实现源码攻略 在实现ATM机的存取款系统时,我们可以采用C语言进行编程,以下是实现源码的攻略: 确定目标 在进行ATM机的编…

    C 2023年5月23日
    00
  • 详解C++ STL模拟实现vector

    当我们在使用C++中的STL容器时,可能有时候我们会想深入了解STL底层的实现原理。这个时候就需要我们自己手动实现一个STL容器来了解其工作原理。在这里,我将详细讲解如何模拟实现一个C++ STL中的vector容器。 实现vector容器 vector定义 首先我们需要了解一下vector是什么。vector是C++ STL容器的一种,可以存储任何类型的数…

    C 2023年5月22日
    00
  • 如何提高画画水平?给迷茫艺术生写的小建议

    如何提高画画水平?给迷茫艺术生写的小建议 在绘画领域,提高画画水平需要不断修炼和实践。以下是一些小建议,希望可以帮助迷茫的艺术生们提高画画水平。 1. 提高绘画技能的练习 要成为一名优秀的画家,需要系统地学习基础绘画技能。以下是一些常用的练习方法: 1.1 画基本形状 要想画好任何东西,首先需要掌握基本形状。 建议在纸上反复练习画圆、方、三角等不同形状,并尝…

    C 2023年5月22日
    00
  • 2015新MacBook配件及主机购买详细攻略

    2015新MacBook配件及主机购买详细攻略 介绍 本攻略旨在向广大MacBook用户详细介绍2015年新款MacBook的配件购买及主机购买的注意事项,帮助大家更好地了解和选购自己需要的产品。 配件购买攻略 1. 手机壳 新款MacBook的外壳较易划伤,建议购买一款手机壳来保护外壳。 根据使用情况和个人喜好,推荐以下两款手机壳: Moshi iGlaz…

    C 2023年5月23日
    00
  • C enum(枚举)

    下面详细讲解一下C语言中枚举(enum)的完整使用攻略。 枚举的定义 C语言中的枚举是一种用户自定义的数据类型,它允许我们定义一组命名的常量。枚举常量被称为枚举值(enum value)。 在C语言中枚举的定义格式为: enum 枚举类型名{ 枚举值1, 枚举值2, …… 枚举值n }; 其中,枚举类型名是一个标识符,它是这个枚举类型的名称;枚举值是一组常量…

    C 2023年5月10日
    00
  • JS运算符简单用法示例

    让我为你详细讲解下“JS运算符简单用法示例”的完整攻略。 概述 在 Javascript 中,运算符是一种符号或关键字,用于对一个或多个值进行操作并生成新值。例如:加法运算符 + 用于将两个值相加,并生成新值。 常见的运算符 下面是一些常见的 Javascript 运算符: 算术运算符 +(加法) -(减法) *(乘法) /(除法) %(取模) 赋值运算符 …

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部