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日

相关文章

  • C语言中求解图形的问题

    求解图形的问题在C语言中是一个常见的问题,这个问题可以通过使用图形库来解决。常见的图形库包括SDL、OpenGL和Qt等,其中要学习的内容包括图形绘制、事件响应和用户交互等等。 下面是一些基本的攻略,帮助你开始学习解决图形问题。 1. 学习基本绘图函数 首先,要学会使用基本的图形绘制函数。这些函数可以通过图形库调用,例如SDL中的 SDL_RenderDra…

    C 2023年5月23日
    00
  • C语言为二维数组分配可能不连续的内存

    为二维数组分配可能不连续的内存空间可以利用数组指针的方式,代码示例如下: // 二维数组指针分配动态内存 int **p; int row = 3, col = 4; p = (int **)malloc(row * sizeof(int *)); for (int i = 0; i < row; ++i) p[i] = (int *)malloc(c…

    C 2023年5月9日
    00
  • mysql(5.6及以下)解析json的方法实例详解

    mysql(5.6及以下)解析json的方法实例详解 背景 在以往的开发中,我们通常使用MySQL来存储数据,然而在数据中存在着大量的json类型的数据,如何快速、便捷的解析json数据就变得尤为重要。本文将介绍Mysql(5.6及以下)中解析json类型数据的方法及实例。 操作步骤 使用JSON_EXTRACT()方法解析json数据 JSON_EXTRA…

    C 2023年5月23日
    00
  • C++ win系统如何用MinGW编译Boost库

    C++ Win系统如何用MinGW编译Boost库 Boost库是一个开源的、高质量的库,包括许多各种各样的工具和库,被广泛应用于C++编程中。MinGW是一个基于GNU编译器的Windows程序开发工具包,提供了一个完整的开发环境,可用于开发Windows应用程序。本攻略介绍如何使用MinGW编译Boost库。 准备工作 1.下载和安装MinGW可以从Mi…

    C 2023年5月23日
    00
  • C++实现图书管理系统最新版

    C++实现图书管理系统最新版 简介 本文将会详细讲解如何使用C++实现一个简单的图书管理系统。此系统模拟了图书馆的基本管理功能,具有管理图书、借阅图书、归还图书等功能。 实现步骤 创建一个C++项目,并在项目中新建一个名为 book.h 的头文件。 在 book.h 中定义一个 Book 结构体,包含以下属性:* int book_id:图书编号* stri…

    C 2023年5月23日
    00
  • 根据json字符串生成Html的一种方式

    根据json字符串生成Html是前端常见操作之一,以下是一种实现方式: 步骤一:解析json字符串 使用JavaScript中提供的JSON.parse()方法,将json字符串解析成对应的JavaScript对象。 const jsonString = ‘{"name": "Joe", "age"…

    C 2023年5月23日
    00
  • C语言算法练习之抓交通肇事犯

    C语言算法练习之抓交通肇事犯 项目简介 抓交通肇事犯是一道经典的C语言算法练习题目。题目描述如下:一辆满载着5个人的车辆在道路上行驶,当它撞上一个人之后停下来了,由于事故发生时视线不好,司机不知道是哪个乘客撞上了行人,警察到达现场后询问了所有乘客,他们的回答如下: A说:“是B撞的人。” B说:“是C撞的人。” C说:“是D撞的人。” D说:“是C撞的人。”…

    C 2023年5月23日
    00
  • 详解C++实现线程安全的单例模式

    我们来详细讲解“详解C++实现线程安全的单例模式”的完整攻略。 线程安全的单例模式 首先,单例模式是一种常见的设计模式,它保证了一个类只有一个实例,并提供了全局访问点。而线程安全的单例模式可以保证在多线程环境下,仍然只有一个实例,并且可以正确地使用。 线程安全的单例模式主要是通过使用互斥锁来保证线程安全的。具体地,我们可以使用以下方式实现。 class Si…

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