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日

相关文章

  • 联想猎魂G27c显示器怎么样 联想猎魂G27c曲面电竞显示器评测

    联想猎魂G27c显示器评测 联想猎魂G27c是一款曲面电竞显示器,下面来详细讲解它的性能和使用效果。 外观设计 联想猎魂G27c采用27寸的曲面屏设计,极窄边框的设计增强了屏幕的视觉效果。机身背部采用全金属材质,同时支架与底座也有金属材质,使得整个机身显得稳定且质感十足。 屏幕性能 联想猎魂G27c采用VA面板,分辨率为1920×1080,响应时间为4ms,…

    C 2023年5月23日
    00
  • C++随机点名生成器实例代码(老师们的福音!)

    首先,我们需要明确实现这个随机点名生成器的基本思路。我们需要一个名单,这个名单中包含每个学生的姓名信息,然后从这个名单中随机选择一个学生进行点名。因此,我们需要把这个名单存储在程序中,并且要有一个随机数函数来随机选择学生。 接下来,我们需要定义一个学生类,用来存储学生的姓名信息。在这个类中,我们需要定义公有的姓名属性,并且需要定义构造函数和析构函数。 在主函…

    C 2023年5月30日
    00
  • Python如何读写JSON格式数据

    什么是JSON格式数据? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人类阅读和编写,并能快速地在服务器和客户端之间传输数据。在Python中,JSON数据可以是一个嵌套的字典对象,或者是一个由字典组成的列表对象。 如何读取JSON格式数据? 在Python中读取JSON格式数据的主要过程如下: (1)在P…

    C 2023年5月23日
    00
  • C语言中的自定义类型之结构体与枚举和联合详解

    C语言中的自定义类型之结构体与枚举和联合详解 什么是自定义类型 C语言中的自定义类型是开发人员按照自己的需求所定义的类型。通过自定义数据类型,可以使数据类型的使用更为规范,提高程序的可读性和可维护性。 C语言中常见的自定义类型包括结构体、枚举和联合。 结构体 结构体是一种用户自定义的数据类型,它允许我们将不同类型的变量组合在一起,形成一个新的数据类型。结构体…

    C 2023年5月23日
    00
  • C语言编写基于TCP和UDP协议的Socket通信程序示例

    下面我来为你详细讲解“C语言编写基于TCP和UDP协议的Socket通信程序示例”的攻略。 一、Socket简介 Socket(套接字)是一种应用程序编程接口(API),也是一种通信协议,用于在计算机网络上实现进程间通信和数据传输。Socket可以用于不同操作系统之间、不同应用程序之间、不同计算机之间的通信。 二、基于TCP协议的Socket通信 1. 创建…

    C 2023年5月22日
    00
  • 简述c++ 发展史

    简述C++ 发展史 C 语言的诞生 C++ 是在 C 语言的基础上发展出来的语言,因此我们先来介绍一下 C 语言的诞生。 C 语言诞生于 1972 年,由 Dennis Ritchie 在贝尔实验室开发,为 Unix 操作系统的编写提供了有效的工具。1983 年,C 语言的标准被 ANSI 委员会采纳。 C++ 的诞生 C++ 是在 C 语言基础上开发的,1…

    C 2023年5月23日
    00
  • C# SQLite库使用技巧

    C# SQLite库使用技巧 简介 SQLite是一种轻量级关系型数据库,具有文件存储、零配置、全平台、事务支持等特点,并且不需要专门的数据库服务器。在C#开发中,SQLite可以通过第三方库System.Data.SQLite来进行使用,本文将介绍SQLite库的使用技巧。 安装System.Data.SQLite库 System.Data.SQLite是…

    C 2023年5月22日
    00
  • 基于C语言实现简单的走迷宫游戏

    基于C语言实现简单的走迷宫游戏攻略 一、准备工作 在实现简单的走迷宫游戏前,我们需要了解以下知识:- C语言基础知识,包括控制语句、函数、数组等;- 迷宫的表示方法,可以使用二维数组实现,其中0代表空白区域,1代表障碍物或墙壁区域;- 搜索算法,如深度优先搜索(DFS)和广度优先搜索(BFS),用于求解迷宫路径。 二、实现步骤 根据以上准备工作,我们可以分为…

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