C语言数据结构 栈的基础操作

C语言数据结构 栈的基础操作

1. 栈的基本概念

栈(Stack)是一种基于LIFO(后进先出)原理的数据结构,类似于一组盘子,只能在盘子的顶部进行操作。每次从顶部添加或移除盘子。

栈具有两个基本操作:入栈(push)和出栈(pop)。当添加一个元素时,我们称其为“push”,当移除一个元素时,我们称其为“pop”。

2. 栈的实现

栈可以使用数组或链表来实现。

2.1 使用数组

使用数组实现栈时,我们可以在数组的末尾添加新元素,同时在末尾移除元素。

以下是使用数组实现栈的基本操作代码:

#define MAXSIZE 100 //定义栈的最大长度

typedef struct {
    int data[MAXSIZE]; // 存放栈中元素的数组
    int top; // 栈顶下标,如果top等于-1,则表示栈为空
} Stack;

void initStack(Stack *s) {
    s->top = -1;
}

int isEmpty(Stack s) {
    return s.top == -1;
}

int isFull(Stack s) {
    return s.top == MAXSIZE - 1;
}

int push(Stack *s, int data) {
    if (isFull(*s)) {
        return 0;
    }
    s->data[++s->top] = data;
    return 1;
}

int pop(Stack *s) {
    if (isEmpty(*s)) {
        return 0;
    }
    --s->top;
    return s->data[s->top + 1];
}

2.2 使用链表

使用链表实现栈时,我们可以在链表的头部添加新元素,同时在头部移除元素。

以下是使用链表实现栈的基本操作代码:

typedef struct Node {
    int data;
    struct Node *next;
} Node;

typedef struct {
    Node *top; // 栈顶节点的指针
} Stack;

void initStack(Stack *s) {
    s->top = NULL;
}

int isEmpty(Stack s) {
    return s.top == NULL;
}

int push(Stack *s, int data) {
    Node *node = (Node *) malloc(sizeof(Node));
    node->data = data;
    node->next = s->top;
    s->top = node;
    return 1;
}

int pop(Stack *s) {
    if (isEmpty(*s)) {
        return 0;
    }
    Node *node = s->top;
    int data = node->data;
    s->top = node->next;
    free(node);
    return data;
}

3. 栈的示例

3.1 判断字符串括号是否匹配

使用栈可以很容易地判断字符串中的括号是否匹配。我们可以将每个左括号入栈,在遇到一个右括号时,弹出栈顶元素并检查是否是相应的左括号。如果不匹配,则说明字符串中的括号不是匹配的。

以下是判断字符串括号是否匹配的代码:

int isMatch(char *s) {
    Stack stack;
    initStack(&stack);
    while (*s != '\0') {
        if (*s == '(' || *s == '[' || *s == '{') {
            push(&stack, *s);
        } else if ((*s == ')' && !isEmpty(stack) && stack.top->data == '(') ||
                   (*s == ']' && !isEmpty(stack) && stack.top->data == '[') ||
                   (*s == '}' && !isEmpty(stack) && stack.top->data == '{')) {
            pop(&stack);
        } else {
            return 0; // 括号不匹配
        }
        ++s;
    }
    return isEmpty(stack);
}

3.2 倒转栈中的元素

我们可以倒转栈中的元素,将栈底元素变成栈顶元素。

以下是倒转栈中元素的代码:

void reverse(Stack *s) {
    if (isEmpty(*s)) {
        return;
    }
    int data = pop(s);
    reverse(s);
    push(s, data);
}

4. 总结

栈是一种基本的数据结构,是许多算法的基础。我们可以使用数组或链表来实现栈,并进行基本操作,如入栈和出栈。同时,栈还可以解决许多实际问题,如括号匹配、表达式求值等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言数据结构 栈的基础操作 - Python技术站

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

相关文章

  • JavaScript数据结构与算法

    JavaScript数据结构与算法完整攻略 什么是数据结构与算法 数据结构和算法是计算机科学的重要组成部分,常用于解决数据处理问题的方法与技术。数据结构是指存储和组织数据的方式,而算法则是解决数据处理问题的途径和方法。 数据结构分类 数据结构可分为以下几类: 数组 —— 存储有序元素集合的线性结构; 栈 —— 一种后进先出的数据结构; 队列 —— 一种先进先…

    数据结构 2023年5月17日
    00
  • go语言数据结构之前缀树Trie

    前缀树Trie 前缀树Trie是一种树形数据结构,被用于快速查找内存中的字符串数据。它非常适合存储大量的字符串,并且能够非常快速的查找以一个指定的字符串前缀开头的全部字符串。 相关术语 在学习前缀树Trie之前,需要掌握一下相关术语: 根节点:Trie树的根节点,代表空字符串。 边:连接两个节点的线,代表一个字符。 节点:表示一个字符串,可能是某个字符串的结…

    数据结构 2023年5月17日
    00
  • C++ 超详细分析数据结构中的时间复杂度

    C++ 超详细分析数据结构中的时间复杂度攻略 什么是时间复杂度? 时间复杂度是用来衡量算法效率的指标,它表示的是算法的执行时间与问题规模之间的关系,通常用大O记法来表示。 如何分析时间复杂度? 1. 常见时间复杂度 以下是常见的时间复杂度及其对应的执行次数: 时间复杂度 对应执行次数 O(1) 常数级别 O(log n) 对数级别 O(n) 线性级别 O(n…

    数据结构 2023年5月17日
    00
  • 莫比乌斯反演,欧拉反演学习笔记

    (未更完) 我算法中也就差点数论没学了,这几周卷了,学了一下,分享一下啊。 我会讲得详细一点,关于我不懂得地方,让新手更容易理解。 学习反演有很多定义啥的必须要记的,学的时候容易崩溃,所以希望大家能坚持下来。   第一个定义: $\lfloor x\rfloor$:意思是小于等于 $x$ 的最大整数。 数论分块 学习反演之前,要先学习一些边角料,先来看数论分…

    算法与数据结构 2023年4月17日
    00
  • Redis高效率原因及数据结构分析

    Redis高效率原因及数据结构分析 Redis高效率的原因 Redis是一款高性能、高可靠性的内存数据库,其高效率的原因主要体现在以下几个方面: 1. 内存存储 Redis数据完全存储在内存中,而不是像传统的关系型数据库一样存储在磁盘中。内存的读写速度要远远快于磁盘的读写速度,因此Redis在数据读写时的速度非常快,能够达到每秒钟数百万次的读写操作。 2. …

    数据结构 2023年5月17日
    00
  • 详解C语言实现空间索引四叉树

    详解C语言实现空间索引四叉树攻略 四叉树是一种常见的空间索引方法,可以有效地处理二维或三维空间中的数据。本攻略将详细介绍使用C语言实现空间索引四叉树的方法,包括数据结构的设计,插入和查询操作的实现。 数据结构设计 结点结构体 struct QuadtreeNode { int depth; // 结点深度 double x, y; // 结点中心坐标 dou…

    数据结构 2023年5月17日
    00
  • C++数据结构与算法之反转链表的方法详解

    C++数据结构与算法之反转链表的方法详解 在C++中,反转链表是一种常见的数据结构与算法技巧。在本文中,我们将详细讲解反转链表的实现过程以及常见的两种反转方法。 基本定义 在开始讲述反转链表算法之前,我们先介绍一下链表的基本定义。 链表是一种数据结构,其中每个节点包含一个数据元素和一个指向下一个节点的指针。下面是一个简单的链表的节点结构定义: struct …

    数据结构 2023年5月17日
    00
  • 数据结构之数组翻转的实现方法

    下面是数据结构之数组翻转的实现方法的详细攻略。 1. 问题描述 在数组中,将元素以轴对称的方式进行翻转,即将数组的第一个元素和最后一个元素交换,第二个元素和倒数第二个元素交换,以此类推。 例如,对于数组[1, 2, 3, 4, 5],经过翻转后变成[5, 4, 3, 2, 1]。 2. 解法讲解 2.1 方法一:双指针法 双指针法是常用的一种方法,可以实现两…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部