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利用语言实现数据结构之队列

    C语言实现队列的完整攻略 什么是队列 队列是一种线性数据结构,它有两个端点:队头和队尾。新的元素插入到队尾,每次从队头取出一个元素。这就类似于人们排队买票,新的买票者排在队尾,每当售票员完成一笔交易,队列头的买票者出队。 基本操作 队列主要有以下3个基本操作: 入队(enqueue):将一个元素添加到队列的尾部 出队(dequeue):从队列的头部移除一个元…

    数据结构 2023年5月17日
    00
  • C语言树状数组的实例详解

    首先需要了解什么是树状数组。树状数组(Binary Indexed Tree,BIT),也叫做 Fenwick 树(树状数组的发明者是Peter M. Fenwick),是一个查询和修改复杂度都为 log(n) 的数据结构,与线段树类似,但使用起来比线段树更加方便以及简洁。 在该攻略中,我们将通过两条树状数组的实例,详细讲解树状数组,让读者更好地理解树状数组…

    数据结构 2023年5月17日
    00
  • C语言中数据结构之链式基数排序

    C语言中数据结构之链式基数排序 概述 链式基数排序是基数排序的一种实现方式。基数排序是一种桶排序算法,它通过将需要排序的数据分成多个桶,并且按照一定的顺序将数据从桶中取出来,以达到排序的目的。链式基数排序则使用了链表结构来实现桶的功能。 实现步骤 链式基数排序的实现步骤如下: 申请链表节点数组,并初始化链表头结点数组。链表的数量等于指定的基数,例如10进制的…

    数据结构 2023年5月17日
    00
  • 【ACM算法竞赛日常训练】DAY4题解与分析【树】【子序列】| 组合数学 | 动态规划

    DAY4共2题: 树(组合数学) 子序列(dp,数学) ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 原文链接(阅读原文获得更好阅读体验):https://www.eriktse.com/algorithm/109…

    算法与数据结构 2023年4月18日
    00
  • JavaScript数据结构Number

    JavaScript数据结构Number 简介 JavaScript中的Number是一种表示数字的数据类型,包括整数和浮点数。Number类型的值是不可变的。 数字类型(Number)的创建 数字类型可以通过直接赋值的方式创建,如: let num = 10; // 整数 let floatNum = 3.14; // 浮点数 另外,JavaScript还…

    数据结构 2023年5月17日
    00
  • 查询json的数据结构的8种方式简介

    查询json的数据结构的8种方式简介 在处理JSON数据时,经常需要提取特定的数据或获取某个属性的值。这时候就需要使用JSON的查询语言来进行查询操作。本文将介绍8种常用的JSON查询方式,帮助大家更方便、快捷地查询和分析JSON数据。 1. 点语法 使用点语法(.)查询JSON数据是最简单、最常用的方式,通过指定属性名来获取相应的值。例如,假设有以下的JS…

    数据结构 2023年5月17日
    00
  • JavaScript队列数据结构详解

    JavaScript队列数据结构详解 本文将为大家详细讲解JavaScript队列数据结构的相关知识。 什么是队列数据结构 队列是一种线性数据结构,它只允许在队列的两端进行插入和删除操作。在队列中,新元素插入到队列的末尾,也称为队尾。而删除操作则是从队列的前面删除元素,也称为队首。 将元素插入队列的操作称为入队,将元素删除队列的操作称为出队。除此之外,还有一…

    数据结构 2023年5月17日
    00
  • 「线段树」!(简单)的线段树

    本题为3月20日23上半学期集训每日一题中B题的题解 题面 题目描述 给你一个序列 \(A[1],A[2],…,A[n]\) .( \(|A[i]| \leq 15007, 1 \leq N \leq 50,000\) ). M( \(1 \leq M \leq 500,000\) ) 次询问,每次询问 \(Query(x, y) = Max{A[i] …

    算法与数据结构 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部