C语言实现栈的示例详解

yizhihongxing

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指针原理教程之语法树及其实现

    C指针原理教程之语法树及其实现 什么是语法树 语法树是编译原理中的概念,指的是代码在编译过程中形成的一种树型结构,用来表示代码的语法结构。 例如下面这段代码: int add(int a, int b) { return a + b; } int main() { int x = 1; int y = 2; int z = add(x, y); return…

    C 2023年5月23日
    00
  • 使用C++一步步实现俄罗斯方块

    使用C++一步步实现俄罗斯方块的完整攻略 什么是俄罗斯方块 俄罗斯方块(Tetris)是一款经典的电子游戏,最早由苏联程序员Alexey Pajitnov于1984年创造。它的玩法非常简单,玩家需要控制不同形状的积木,让它们在游戏界面中形成一行,然后这一行就会消失,玩家可以得到相应的分数。如果积木堆满了整个屏幕,游戏就会结束。 如何使用C++实现俄罗斯方块 …

    C 2023年5月23日
    00
  • c++11 新特性——智能指针使用详解

    C++11 新特性——智能指针使用详解 在C++中,内存管理一直是一个非常重要的事情,一个常见的错误就是忘记释放先前分配的内存。C++11引入了智能指针,从而使得内存管理更加方便。本文将详细介绍智能指针的使用方法。 智能指针概述 C++中的智能指针是一种RAII(Resource Acquisition Is Initialization)机制的实现,它通过…

    C 2023年5月22日
    00
  • 如何获取C++类成员虚函数地址的示例代码

    获取C++类成员虚函数地址可以通过以下步骤完成: 步骤1:定义一个具有多个虚函数的C++类。 class Base { public: virtual void func1() { cout << "Base::func1()" << endl; } virtual void func2() { cout <…

    C 2023年5月23日
    00
  • 详解C++ 模板编程

    详解C++ 模板编程攻略 什么是模板编程 模板编程是一种C++编程技术,利用它可以编写具有通用性和可重用性的代码。使用模板编程技术,我们可以让我们的代码更加灵活且容易扩展。 模板编程主要依托于C++的模板(template)机制,通过在编译期间对类型参数进行自动推导,以实现代码的通用性和类型无关性。 模板的解析 在C++中,我们可以通过template来声明…

    C 2023年5月23日
    00
  • C++读取访问权限冲突引发异常问题的原因分析

    C++读取访问权限冲突引发异常问题的原因分析 问题描述 在C++中,我们可以通过访问权限指定成员变量和成员函数的可见性。而当我们在一个类的外部以非法方式访问一个私有成员变量或者私有成员函数时,C++编译器将会产生一个访问权限冲突的异常。这种异常会导致程序崩溃或者无法执行下去。本文将针对这个问题进行分析,帮助读者更好地理解其原因并寻找解决方案。 问题原因 访问…

    C 2023年5月23日
    00
  • Win7系统蓝屏提示0x000000CA错误代码的解决方法

    Win7系统蓝屏提示0x000000CA错误代码的解决方法 前言 在使用Windows 7操作系统的过程中,有时候会遇到蓝屏错误提示,其中错误代码为0x000000CA。此错误通常与内存的使用有关,但具体问题可能很多。本文将提供一些解决方案,帮助您解决这个问题。 解决方案 方法一:检查硬件 首先,我们需要检查硬件是否正常工作。有一些问题可能会导致0x0000…

    C 2023年5月23日
    00
  • C语言实现简易版扫雷游戏

    C语言实现简易版扫雷游戏攻略 概述 本攻略将介绍如何使用C语言实现简易版扫雷游戏,包括实现随机雷区、点击格子、处理周围格子等功能。该游戏采用命令行界面,通过键盘输入操作。 实现步骤 1. 设置随机雷区 首先,需要在二维数组中生成随机雷区。定义一个二维数组保存游戏格子的状态,其中值为-1的表示雷,其余为数字,表示周围雷数。 #define ROWS 10 #d…

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