C语言实现栈的示例详解

C语言实现栈的示例详解

栈(Stack)是一种非常重要的数据结构,在许多编程语言中都有广泛的应用。在C语言中,我们可以利用数组来实现栈数据结构。下面将介绍C语言实现栈的示例详解。

栈的结构

栈是一种线性数据结构,它具有以下特点:

  • 后进先出(LIFO):最后压入栈的元素最先出栈;
  • 插入(入栈)和删除(出栈)操作都在栈顶进行。

示意图如下:

|_______| <--- top
|_______|
|_______|
|_______|
|_______|

实现步骤

1. 定义栈的结构体

首先,你需要定义一个结构体来表示栈,其中包含以下元素:

  • 一个指向栈顶元素的指针 top
  • 一个整数数组 data,用于存储栈中的数据
  • 一个整数 size,表示栈的容量
#define STACK_SIZE 10

typedef struct {
    int *data;
    int top;
    int size;
} Stack;

2. 实现初始化函数

栈的初始化函数会创建一个新的栈结构体,并动态分配存储栈元素用的内存。

void init_stack(Stack *s, int size)
{
    s->data = (int*)malloc(size * sizeof(int));
    s->top = -1;
    s->size = size;
}

3. 实现入栈函数

入栈函数需要将元素压入栈,并将 top 指针指向它。这个函数还要检查栈是否已满,如果已满就打印一个错误信息并返回。

int push(Stack *s, int value)
{
    if (s->top >= s->size - 1) {
        printf("Error: stack overflow\n");
        return -1;
    } else {
        s->top++;
        s->data[s->top] = value;
        return 0;
    }
}

4. 实现出栈函数

出栈函数需要从栈中删除元素,并将 top 指针指向栈中的新顶部元素。这个函数还要检查栈是否为空,如果为空就打印一个错误信息并返回。

int pop(Stack *s)
{
    if (s->top <= -1) {
        printf("Error: stack underflow\n");
        return -1;
    } else {
        int value = s->data[s->top];
        s->top--;
        return value;
    }
}

5. 实现栈销毁函数

最后,你需要释放存储栈元素使用的内存。

void destroy_stack(Stack *s)
{
    free(s->data);
}

示例说明

示例1:栈的基本操作

#include <stdio.h>
#include <stdlib.h>

#define STACK_SIZE 10

typedef struct {
    int *data;
    int top;
    int size;
} Stack;

void init_stack(Stack *s, int size)
{
    s->data = (int*)malloc(size * sizeof(int));
    s->top = -1;
    s->size = size;
}

int push(Stack *s, int value)
{
    if (s->top >= s->size - 1) {
        printf("Error: stack overflow\n");
        return -1;
    } else {
        s->top++;
        s->data[s->top] = value;
        return 0;
    }
}

int pop(Stack *s)
{
    if (s->top <= -1) {
        printf("Error: stack underflow\n");
        return -1;
    } else {
        int value = s->data[s->top];
        s->top--;
        return value;
    }
}

void destroy_stack(Stack *s)
{
    free(s->data);
}

int main()
{
    Stack s;
    init_stack(&s, STACK_SIZE);

    push(&s, 10);
    push(&s, 20);
    push(&s, 30);

    printf("%d\n", pop(&s));
    printf("%d\n", pop(&s));
    printf("%d\n", pop(&s));

    destroy_stack(&s);

    return 0;
}

该示例中,我们创建一个栈,并将三个元素压入栈中。然后我们依次弹出这三个元素,它们的值分别为30、20、10。 最后,我们销毁栈并释放存储元素的内存。

示例2:栈的括号匹配

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STACK_SIZE 100

typedef struct {
    char *data;
    int top;
    int size;
} Stack;

void init_stack(Stack *s, int size)
{
    s->data = (char*)malloc(size * sizeof(char));
    s->top = -1;
    s->size = size;
}

int push(Stack *s, char value)
{
    if (s->top >= s->size - 1) {
        printf("Error: stack overflow\n");
        return -1;
    } else {
        s->top++;
        s->data[s->top] = value;
        return 0;
    }
}

char pop(Stack *s)
{
    if (s->top <= -1) {
        printf("Error: stack underflow\n");
        return -1;
    } else {
        char value = s->data[s->top];
        s->top--;
        return value;
    }
}

void destroy_stack(Stack *s)
{
    free(s->data);
}

int is_matching_pair(char left, char right)
{
    if (left == '(' && right == ')') {
        return 1;
    } else if (left == '[' && right == ']') {
        return 1;
    } else if (left == '{' && right == '}') {
        return 1;
    } else {
        return 0;
    }
}

int is_balanced(char *expression)
{
    Stack s;
    init_stack(&s, STACK_SIZE);

    for (int i = 0; i < strlen(expression); i++) {
        if (expression[i] == '(' || expression[i] == '[' || expression[i] == '{') {
            push(&s, expression[i]);
        } else if (expression[i] == ')' || expression[i] == ']' || expression[i] == '}') {
            if (s.top == -1 || !is_matching_pair(pop(&s), expression[i])) {
                return 0;
            }
        }
    }

    if (s.top == -1) {
        return 1;
    } else {
        return 0;
    }

    destroy_stack(&s);
}

int main()
{
    char expression[100];
    printf("Enter an expression: ");
    fgets(expression, 100, stdin);
    if (is_balanced(expression)) {
        printf("The expression is balanced.\n");
    } else {
        printf("The expression is not balanced.\n");
    }
    return 0;
}

该示例中,我们利用栈实现了一个括号匹配的程序。我们首先定义了一个函数 is_matching_pair,用于判断左括号和右括号是否匹配。然后我们构建了一个函数 is_balanced,用于检查传入的表达式是否是平衡的,即每个左括号都有一个匹配的右括号。我们遍历输入字符串中的每个字符。如果字符是左括号,我们将它压入栈中。如果字符是右括号,我们弹出栈顶元素并检查它是否与当前字符匹配。如果弹出的栈顶元素与当前字符不匹配或者栈为空,我们就表示该表达式不是平衡的。

总结

这个示例为你展示了如何在C语言中实现一个简单的栈数据结构。你可以使用这个栈来实现许多有趣的算法和数据结构,例如:表达式求值、字符串反转、逆波兰表达式等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现栈的示例详解 - Python技术站

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

相关文章

  • C语言 strncpy()函数

    下面是关于 C 语言中 strncpy() 函数的详细使用攻略: 一、函数简介 strncpy() 函数是 C 语言中的字符串复制函数,它可以复制指定长度的字符串,并返回目标字符串地址。 函数原型如下: char* strncpy(char* dest, const char* src, size_t n); 参数说明:- dest:目标字符串,拷贝后的字符…

    C 2023年5月9日
    00
  • 如何用矩形法(梯形法)求定积分

    当我们需要求一个函数在某一区间上的定积分时,可以采用矩形法(梯形法)进行计算。下面是具体的步骤: 步骤1:将区间等分成若干个小区间 将要求定积分的区间[a,b]等分成n个小区间,步长为Δx = (b-a)/n,n通常会选择2的倍数,如n=2、4、8、16等,这样可以使得每个小区间的宽度相等。用x_i表示第i个小区间左端点的位置,则有x_0=a, x_1=a+…

    C 2023年5月23日
    00
  • 浅谈chuck-lua中的多线程

    浅谈chuck-lua中的多线程 什么是chuck-lua chuck-lua是一款基于C++和Lua的实时音频编程语言,它融合了Lua解释器和ChucK的实时音频处理能力,可以用于实时音频处理和音乐创作。在chuck-lua中,通过Lua的脚本编写来控制实时音频流入流出,ChucK作为音频引擎进行低延迟的实时音频处理。chuck-lua同时支持多线程操作,…

    C 2023年5月22日
    00
  • C语言创建和使用不透明指针

    C语言创建和使用不透明指针 什么是不透明指针 不透明指针是一种指针类型,在定义时不指定指向的数据类型,编译器无法确定指针所指向的数据的内存大小和类型,从而使得指向的数据对用户来说是不可见的,只有通过特定的函数接口才能访问到对应的数据。 不透明指针的常见应用场景是在某些库中,对外部提供一些数据类型,但是不希望把具体的实现细节暴露给外部使用者。 不透明指针的创建…

    C 2023年5月10日
    00
  • C 排序算法

    C 排序算法的使用攻略 1. 确定排序算法 首先需要确定使用哪种排序算法。 C 语言支持多种排序算法,例如:冒泡排序、选择排序、插入排序、归并排序、快速排序等。 对于不同的排序场景,选择不同的排序算法,可以提高排序的效率。 2. 实现排序函数 在 C 语言中,可以自己实现排序函数,也可以使用库函数。 以下是一个简单的冒泡排序函数的实现: void bubbl…

    C 2023年5月10日
    00
  • C程序 计算自然数之和

    让我为您详细讲解如何使用“C程序 计算自然数之和”。 什么是C程序 计算自然数之和 “C程序 计算自然数之和”是一段使用C语言编写的程序,它可以计算从1到N的所有自然数之和,并将结果输出到屏幕上。该程序能够帮助学习C语言的初学者熟悉基础语法和算法思想。 如何使用C程序 计算自然数之和 使用C程序 计算自然数之和非常简单,您只需要按照以下步骤进行操作即可。 1…

    C 2023年5月10日
    00
  • C++ 利用硬件加速矩阵乘法的实现

    C++ 利用硬件加速矩阵乘法的实现 介绍 矩阵乘法是计算机科学中的基本算法之一。通常来说,矩阵乘法是一个非常耗时的计算过程,特别是在矩阵规模非常大的情况下,为了提高矩阵乘法的计算速度,我们可以使用硬件加速的方法,例如使用CPU或GPU指令集中的高性能指令。 实现 在C++中,我们可以使用不同的方式实现矩阵乘法算法。这里我们介绍两种常见的实现方法: 方法一 使…

    C 2023年5月22日
    00
  • 知识蒸馏联邦学习的个性化技术综述

    知识蒸馏联邦学习的个性化技术综述 本篇文章主要介绍了知识蒸馏联邦学习的个性化技术。首先,对知识蒸馏技术和联邦学习技术进行了简要的介绍,然后通过分析后不同的组合方式,提出了三种个性化联邦学习方法,分别是FEDKD、FEMKD和FedMD等。 知识蒸馏技术 知识蒸馏技术是一种将一个深度神经网络的知识传递到另一个网络上的方法。也就是说,利用一个较大而准确的模型来对…

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