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

yizhihongxing

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日

相关文章

  • Java数据结构之图的两种搜索算法详解

    Java数据结构之图的两种搜索算法详解 引言 图是现实世界中最为普遍的现象之一,因此对于图的分析和操作是计算机科学和工程中最为重要的问题之一。在本文中,我们将对图结构的两种搜索算法进行详细讨论和研究,这些算法是图论研究的基本工具。 图的定义 在计算机科学和数学领域中,图是由若干个节点(或称为顶点)和它们之间的边组成的一种数据结构。 图的两种搜索算法 图的搜索…

    数据结构 2023年5月17日
    00
  • C语言数据结构与算法之链表(一)

    欢迎阅读本篇文章,本文将为大家详细讲解C语言中数据结构与算法之链表。接下来,将从以下几个方面为大家讲述: 链表的定义 链表的特点 链表的分类 单向链表的实现及应用 双向链表的实现及应用 示例说明 1. 链表的定义 链表是由一系列节点组合而成的数据结构,每个节点都包含了一个数据域和一个指向下一个节点的指针域。其中,链表的头结点为第一个节点,而尾节点为最后一个节…

    数据结构 2023年5月17日
    00
  • MySQL索引详解及演进过程及面试题延伸

    MySQL索引详解及演进过程及面试题延伸 索引的作用 在 MySQL 中,索引是一种数据结构,可用于快速查找和访问表中的数据。使用索引可以大大提高查询效率,特别是在大型数据表中。 索引可以看作是一本书中的目录,目录中列出了每个章节的页码,通过查询目录,读者可以快速找到感兴趣的章节。 索引的种类 MySQL 中支持多种类型的索引,下面我们介绍一下常见的索引类型…

    数据结构 2023年5月17日
    00
  • C语言数据结构时间复杂度及空间复杂度简要分析

    C语言数据结构时间复杂度及空间复杂度简要分析 什么是时间复杂度和空间复杂度? 在分析算法和数据结构的性能时,时间复杂度和空间复杂度是必须考虑的因素。 时间复杂度:衡量算法执行时间所需的资源,也就是算法的速度。通常使用“大O符号”来表示时间复杂度,例如O(1)、O(n)、O(nlogn)等。 空间复杂度:衡量算法使用的内存资源,也就是算法的空间利用率。通常使用…

    数据结构 2023年5月17日
    00
  • python学习数据结构实例代码

    “Python学习数据结构实例代码”的完整攻略如下: 1. 学习前提 在学习Python数据结构之前,需要具备一定的Python基础知识,包括语法、数据类型、操作符、控制流等基础知识。 2. 学习步骤 2.1 选择学习资料 可以选择阅读相关书籍或者参加在线课程来学习Python数据结构。推荐一些经典的学习资料: 《Python基础教程》第二版(作者:Magn…

    数据结构 2023年5月17日
    00
  • C语言编程数据结构的栈和队列

    C语言编程数据结构的栈和队列 什么是栈 栈(Stack) 是限定仅在表尾进行插入和删除操作的线性表。栈也称为后进先出( Last In First Out)的线性表,简称 LIFO 结构。栈结构有两个最重要的操作:入栈和出栈。其中,入栈操作向栈中添加一个元素,出栈操作从栈中删除一个元素。 栈的基本操作 初始化栈 入栈 出栈 取栈顶元素 判空 判满 // 栈的…

    数据结构 2023年5月17日
    00
  • C++高级数据结构之并查集

    C++高级数据结构之并查集 什么是并查集 并查集(Union Find Set)是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。 并查集定义了如下的三种操作: 1、makeSet(s):建立一个新的并查集,其中包含s个单元素集合。 2、unionSet(x, y):把元素x和元素y所在的集…

    数据结构 2023年5月17日
    00
  • java 数据结构之栈与队列

    Java 数据结构之栈与队列 什么是栈? 栈是一种根据先进后出(LIFO)原则的数据结构,即最后压入的元素最先弹出。栈可以用数组或链表实现。栈的两个基本操作是 push(入栈)和 pop(出栈)。 栈的特性 只允许在栈的顶部插入和删除元素。 操作受限只能从一端进行。 元素的插入和删除时间复杂度都为 O(1)。 栈的示例 以下是使用 Java 语言实现栈的示例…

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