C语言实现栈的示例代码

下面我会给您讲解一下C语言实现栈的示例代码的完整攻略。

一、栈的定义

栈(Stack)是一种只能在一端进行插入或删除操作的线性表。栈按照先进后出(Last in First Out)的原则进行操作,也就是说后插入进去的元素先被删除。

栈的两个特殊点:

  • 栈底:数据插入的一端,即数据结构的初始位置。
  • 栈顶:栈最近插入的元素所在的位置。

二、栈的操作

栈的基本操作包括:

  • 初始化栈:创建一个新的空栈。
  • 压栈:在栈顶插入元素。
  • 弹栈:删除并返回栈顶元素。
  • 获取栈顶元素:查询最后插入的元素但不删除。
  • 判断栈是否为空:查询栈是否为空栈。

三、C语言实现栈的示例代码

以下就为大家介绍一个简单的C语言实现栈的示例代码:

#define MAXSIZE 100                              // 定义栈的最大长度

typedef struct {
    int data[MAXSIZE];                           // 存储元素的数组
    int top;                                     // 栈顶指针
} Stack;

void InitStack(Stack *s) {                        // 初始化栈
    s->top = -1;
}

bool Push(Stack *s, int x) {                      // 插入元素
    if (s->top == MAXSIZE - 1) {                  // 判断栈是否已满
        return false;
    }
    s->top++;                                    // 栈顶指针加1
    s->data[s->top] = x;                         // 插入元素
    return true;
}

bool Pop(Stack *s, int *x) {                      // 删除并返回元素
    if (s->top == -1) {                           // 判断栈是否为空
        return false;
    }
    *x = s->data[s->top];                         // 取出栈顶元素
    s->top--;                                     // 栈顶指针减1
    return true;
}

bool GetTop(Stack *s, int *x) {                    // 获取栈顶元素
    if (s->top == -1) {                            // 判断栈是否为空
        return false;
    }
    *x = s->data[s->top];
    return true;
}

bool IsEmpty(Stack *s) {                           // 判断栈是否为空
    if (s->top == -1) {
        return true;
    }
    return false;
}

以上是一个C语言栈的示例代码,其中定义了一个结构体Stack,里面包含一个数组data和一个栈顶指针top。函数实现了初始化栈、插入元素、删除并返回元素、获取栈顶元素和判断栈是否为空的功能。

下面给出两个简单的示例说明:

示例一:利用栈实现字符串的反转

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

#define MAXSIZE 100

typedef struct {
    char data[MAXSIZE];
    int top;
} Stack;

void InitStack(Stack *s) {
    s->top = -1;
}

bool Push(Stack *s, char x) {
    if (s->top == MAXSIZE - 1) {
        return false;
    }
    s->top++;
    s->data[s->top] = x;
    return true;
}

bool Pop(Stack *s, char *x) {
    if (s->top == -1) {
        return false;
    }
    *x = s->data[s->top];
    s->top--;
    return true;
}

bool IsEmpty(Stack *s) {
    if (s->top == -1) {
        return true;
    }
    return false;
}

int main() {
    char str[MAXSIZE];
    Stack s;
    int i;
    printf("请输入一个字符串:");
    scanf("%s", str);
    int len = strlen(str);
    InitStack(&s);
    for (i = 0; i < len; i++) {
        Push(&s, str[i]);
    }
    for (i = 0; i < len; i++) {
        Pop(&s, &str[i]);
    }
    printf("反转后的字符串为:%s\n", str);
    return 0;
}

对于这个示例,首先定义了一个栈的结构体,包含了一个字符数组data和栈顶指针top。定义了初始化栈、插入元素、删除并返回元素和判断栈是否为空的函数。然后在主函数中,输入一个字符串后将其依次压入栈中。接下来,依次弹栈并将取到的字符放回字符串,最后输出反转后的结果。

示例二:利用栈判断一个字符串是否为回文字符串

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

#define MAXSIZE 100

typedef struct {
    char data[MAXSIZE];
    int top;
} Stack;

void InitStack(Stack *s) {
    s->top = -1;
}

bool Push(Stack *s, char x) {
    if (s->top == MAXSIZE - 1) {
        return false;
    }
    s->top++;
    s->data[s->top] = x;
    return true;
}

bool Pop(Stack *s, char *x) {
    if (s->top == -1) {
        return false;
    }
    *x = s->data[s->top];
    s->top--;
    return true;
}

bool IsEmpty(Stack *s) {
    if (s->top == -1) {
        return true;
    }
    return false;
}

int main() {
    char str[MAXSIZE];
    Stack s;
    int i;
    bool flag = true;                // 标记变量
    printf("请输入一个字符串:");
    scanf("%s", str);
    int len = strlen(str);
    InitStack(&s);
    for (i = 0; i < len; i++) {
        Push(&s, str[i]);
    }
    for (i = 0; i < len; i++) {
        char x;
        Pop(&s, &x);
        if (x != str[i]) {           // 当有字符不相等时,说明不是回文字符串
            flag = false;
            break;
        }
    }
    if (flag) {
        printf("%s是回文字符串\n", str);
    } else {
        printf("%s不是回文字符串\n", str);
    }
    return 0;
}

对于这个示例,首先同样定义了一个栈的结构体,包含了一个字符数组data和栈顶指针top。定义了初始化栈、插入元素、删除并返回元素和判断栈是否为空的函数。然后在主函数中,输入一个字符串后将其依次压入栈中。接下来,依次弹栈并与原字符串中的字符进行比较,当有不相等的情况出现时,说明这个字符串不是回文字符串。如果全部字符都相等,说明这是一个回文字符串。

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

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

相关文章

  • 如何通过函数指针调用函数(实现代码)

    当涉及到函数指针时,我们需要先了解函数指针的定义以及使用方法。函数指针是指针变量,它指向函数的地址,可以用来调用函数。以下是如何通过函数指针调用函数的完整攻略: 定义函数指针 要定义函数指针,需要指定函数的返回类型以及参数类型,如下所示: int (*func_ptr)(int, int); 这个函数指针指向一个返回类型为int,参数类型为int和int的函…

    C 2023年5月23日
    00
  • 深入理解JavaScript系列(17):面向对象编程之概论详细介绍

    深入理解JavaScript系列(17):面向对象编程之概论详细介绍 前言 本文是深入理解JavaScript系列的第17篇,讲解面向对象编程的概念、理论和实践。在JavaScript中,我们可以使用面向对象编程(Object-Oriented Programming,OOP)的方式,构建更灵活、可维护性更好的代码。 什么是面向对象编程? 面向对象编程是一种…

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

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

    C 2023年5月23日
    00
  • Go如何实现json字符串与各类struct相互转换

    Go 语言提供了 encoding/json 包来支持 JSON 数据的编解码操作。该包中提供了 Marshal 和 Unmarshal 函数,可实现将 struct 对象序列化成 JSON 字符串和将 JSON 字符串反序列化为 struct 对象的操作。下面我将详细讲解如何使用 encoding/json 包实现 JSON 字符串与各类 struct 的…

    C 2023年5月23日
    00
  • win10下VSCode+CMake+Clang+GCC环境搭建教程图解

    以下是“win10下VSCode+CMake+Clang+GCC环境搭建教程图解”的完整攻略。 简介 Visual Studio Code是一款非常流行的开源跨平台代码编辑器。而CMake、Clang和GCC则是C/C++开发中用到的重要工具和库,它们能够优化代码编译、调试等方面的问题。在win10系统下配置VS Code+CMake+Clang+GCC环境…

    C 2023年5月23日
    00
  • C/C++实现线性顺序表的示例代码

    下面是关于“C/C++实现线性顺序表”的完整攻略: 什么是线性顺序表 在计算机科学中,线性顺序表(Linear Sequences List)是一种连续的数据结构,也被称为数组,它由一组元素组成,并按线性顺序排列。线性顺序表中,每个元素和其相邻元素之间仅有了顺序关系,它们之间没有其他关系。通常情况下,线性顺序表采用数组来实现,支持随机访问操作。 C/C++实…

    C 2023年5月24日
    00
  • 通过VS中的数据源选择对话框简单实现数据库连接配置

    通过VS中的数据源选择对话框,可以简单地实现数据库连接配置。下面将分为以下几个步骤来介绍如何实现: 1. 打开Server Explorer 在Visual Studio的视图菜单中选择“Server Explorer”或者使用快捷键“Ctrl+\,Ctrl+S”来打开Server Explorer。 2. 添加数据源 在Server Explorer中右键…

    C 2023年5月23日
    00
  • Excel如何使用组合函数combin

    Excel如何使用组合函数COMBIN comibn函数的作用 COMBIN函数用于计算从一组n个元素中选择r个元素的组合数。其数学公式为: COMBIN(n, r) = n!/((n-r)!*r!) 其中, n为总元素数,r为选中元素数. COMBIN函数的使用方法 COMBIN函数的语法为: COMBIN(number, number_chosen) 参…

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