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日

相关文章

  • C++数据结构与算法之判断一个链表是否为回文结构的方法

    当我们遇到判断一个链表是否为回文结构的问题时,可以考虑使用如下的方法: 遍历链表,将链表节点的值存储到一个数组或者栈中。 遍历链表,将链表节点的值与前面存储的值进行比较,如果全部相同,则证明链表为回文结构。 下面是详细的代码实现和示例说明: 实现 首先,我们需要定义一个链表节点的结构体,包括节点值和指向下一个节点的指针: struct ListNode { …

    数据结构 2023年5月17日
    00
  • C++数据结构之二叉搜索树的实现详解

    C++数据结构之二叉搜索树的实现详解 1. 什么是二叉搜索树? 二叉搜索树是一种二叉树,其中每个节点都包含一个键值,且每个节点的键值都大于其左子树中任何节点的键值,小于其右子树中任何节点的键值。如下图所示: 9 / \ 4 15 / \ 12 20 在上面的二叉搜索树中,节点的键值分别是9, 4, 15, 12, 20,且每个节点的键值都符合上述定义。 2.…

    数据结构 2023年5月17日
    00
  • C++ 数据结构之布隆过滤器

    C++ 数据结构之布隆过滤器 简介 布隆过滤器是一种用于快速判断一个元素是否存在于一个集合中的数据结构。它的空间效率和查询效率都比较高,在某些场景下,它可以代替传统的哈希表。 原理 布隆过滤器的基本原理是:将一个元素映射为多个位数组中的位置。在插入元素时,将这些位置上的值设置为1;在查询元素时,如果这些位置上的值都为1,则认为元素存在于集合中;否则认为元素不…

    数据结构 2023年5月17日
    00
  • C语言数据结构与算法之图的遍历(一)

    我来给您详细讲解一下“C语言数据结构与算法之图的遍历(一)”的完整攻略。 简介 本篇攻略主要介绍了图的遍历问题。图是由若干个点和连接这些点的边构成的数据结构,常用来表示复杂的关系和网络。图的遍历就是从图的某一点开始,按照一定的规则沿着边逐个访问图中所有的点,不重不漏地遍历整个图。 在本篇攻略中,我们将探讨图的深度优先遍历(DFS)和广度优先遍历(BFS)两种…

    数据结构 2023年5月17日
    00
  • React前端解链表数据结构示例详解

    我将为您详细讲解“React前端解链表数据结构示例详解”的完整攻略。 React前端解链表数据结构示例详解 一、前置知识 在学习本篇文章之前,您需要掌握以下前置知识: 基本的 JavaScript 语法 React 中的组件概念和生命周期 链表数据结构的基本概念和操作方法 如果您对以上知识点还不是很熟悉,可以先自学相关知识再来阅读本文。 二、链表数据结构简介…

    数据结构 2023年5月17日
    00
  • Java数据结构之图的路径查找算法详解

    Java数据结构之图的路径查找算法详解 什么是图? 在计算机科学中,图是一种非常常见的数据结构,用于表示图形和网络等概念。图由节点和边组成,其中节点表示实体,边表示这些实体之间的关系。节点和边可以表示各种各样的实体和关系,因此图在计算机科学中具有广泛的应用。 图的路径查找算法 路径查找算法是一个用途广泛的算法,它用于查找从一个节点到另一个节点的路径。在图中,…

    数据结构 2023年5月17日
    00
  • Java数据结构之LinkedList的用法详解

    Java数据结构之LinkedList的用法详解 LinkedList简介 LinkedList是Java中的一个数据结构,它是一个双向链表,可以提供快速的插入和删除操作。LinkedList中的元素分别保存在每个节点中,每个节点包含了指向前一个节点和后一个节点的引用。 使用LinkedList的好处是,其可以快速的进行插入和删除操作,但是如果需要随机存取中…

    数据结构 2023年5月17日
    00
  • MySQL底层数据结构选用B+树的原因

    MySQL底层数据结构选用B+树的原因主要是因为B+树具有以下优点: 能够快速查找B+树的查找速度非常快,时间复杂度为O(log n),在海量数据的环境中,能够快速定位目标数据。因为B+树每次查找只需要遍历树高度的次数,即使数据量很大,树的高度也很小。 能够高效地进行增删改操作B+树的平衡性能够保证树的高度非常小,大部分操作只需要遍历树的高度,而不是整颗树,…

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