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日

相关文章

  • 三星C480FW打印机出现脱机问题怎么复位?

    三星C480FW打印机出现脱机问题如何复位? 如果你的三星C480FW打印机出现了脱机(Offline)问题,这可能是由于打印机连接的USB或无线网络中的问题导致。以下是复位打印机的步骤: 1. 确认网络连接 首先,你需要确保打印机已经正确连接到网络,并且网络连接是可靠的。 网络打印机 如果你的三星C480FW打印机是连接到网络的,你可以按照以下步骤来确保打…

    C 2023年5月23日
    00
  • win10开机蓝屏终止代码SYSTEM_SERVICE_EXCEPTION怎么办

    以下是针对“win10开机蓝屏终止代码SYSTEM_SERVICE_EXCEPTION”的详细攻略: 概述 “SYSTEM_SERVICE_EXCEPTION”是Windows系统蓝屏错误代码之一,表示系统服务异常。出现这种错误一般是由于系统设备驱动程序出现问题或者是系统文件损坏等原因引起的。启动Windows时出现“SYSTEM_SERVICE_EXCEP…

    C 2023年5月23日
    00
  • python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案

    Python对任意数据和曲线进行拟合并求出函数表达式有以下三种常见的解决方案: 多项式拟合: 多项式拟合是一种最简单的拟合方法,其实现思路是在已有的数据点上,通过构建一个多项式,来逼近已知的函数。在Python中,使用numpy库中的polyfit函数来实现多项式拟合。具体步骤如下: import numpy as np import matplotlib.…

    C 2023年5月22日
    00
  • C++利用jsoncpp库实现写入和读取json文件

    下面是C++利用jsoncpp库实现写入和读取json文件的完整攻略。 安装jsoncpp库 首先需要安装jsoncpp库,可以通过以下方式进行安装: 使用apt-get命令在Ubuntu系统下安装: sudo apt-get install libjsoncpp-dev 使用yum命令在CentOS系统下安装: sudo yum install jsonc…

    C 2023年5月23日
    00
  • c语言分离三位数的实现

    C语言分离三位数的实现 问题描述 需要将一个三位数拆分成它的百位、十位、个位并分别输出。 实现思路 首先我们需要得到这个三位数的百位、十位、个位,然后分别输出即可。对于一个三位数$abc$,它的百位是$a$,十位是$b$,个位是$c$。我们可以使用除法和取余两种方式来获取这三个数字。 除法:$a = abc / 100$;$b = abc / 10 \% 1…

    C 2023年5月23日
    00
  • 使用批处理异地备份数据(winrar)

    下面我将详细讲解如何使用批处理异地备份数据(winrar)。 1. 准备工作 在使用批处理进行异地备份之前,需要先下载安装 WinRAR 软件,并确保已经设置好环境变量。同时需要确定好备份的目录和备份的目标路径。 2. 编写批处理脚本 我们可以使用 notepad 或者其他文本编辑器来编写批处理脚本。打开文本编辑器,输入如下代码: @echo off set…

    C 2023年5月22日
    00
  • C/C++中退出线程的四种解决方法

    下面是关于C/C++中退出线程的四种解决方法的详细攻略: 1. 线程函数自行退出 最常用的方法是让线程函数自行退出,这可以通过return语句或pthread_exit函数来实现。在函数执行完毕后,线程会自动退出并等待被回收。示例代码如下: #include <stdio.h> #include <pthread.h> void *t…

    C 2023年5月22日
    00
  • C++ 中构造函数的实例详解

    C++ 中构造函数的实例详解 什么是构造函数 在 C++ 中,构造函数是一个特殊的函数,用于在对象被创建时进行初始化的操作。每个类都必须拥有至少一个构造函数,否则编译器将会自动为其创建一个默认构造函数。 构造函数的定义和调用 构造函数与普通函数类似,也有参数和函数体,但是它没有返回值和函数名称与类名相同。构造函数在创建对象时自动调用。 class MyCla…

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