C语言详解如何实现顺序栈

当我们需要实现一个顺序栈时,需要先定义栈结构体,然后实现栈的基本操作,包括入栈、出栈等。以下为具体步骤:

1. 定义栈结构体

定义一个结构体,包含栈的基本属性:

typedef struct SeqStack {
    int *data;      // 栈的元素存储空间
    int size;       // 栈的大小
    int top;        // 栈顶指针
} SeqStack;

其中,data是指向栈元素存储空间的指针,size是栈的大小(即最多可以存储的元素个数),top是栈顶指针,指向最后一个入栈的元素。

2. 初始化栈

对于一个空栈,需要进行初始化操作,即给栈分配空间,并将栈顶指针置为-1。

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

3. 判断栈是否为空

可以通过判断栈顶指针是否等于-1来判断栈是否为空。

int isSeqStackEmpty(SeqStack *s)
{
    return s->top == -1;
}

4. 判断栈是否已满

可以通过判断栈顶指针是否等于栈的大小减1来判断栈是否已满。

int isSeqStackFull(SeqStack *s)
{
    return s->top == s->size - 1;
}

5. 入栈操作

当栈不为空且未满时,可以进行入栈操作,即将元素压入栈顶,并将栈顶指针加一。

void pushSeqStack(SeqStack *s, int x)
{
    if (!isSeqStackFull(s)) {
        s->top++;
        s->data[s->top] = x;
    } else {
        printf("ERROR: Stack overflow!\n");
    }
}

6. 出栈操作

当栈不为空时,可以进行出栈操作,即将栈顶元素弹出,并将栈顶指针减一。

int popSeqStack(SeqStack *s)
{
    if (!isSeqStackEmpty(s)) {
        int x = s->data[s->top];
        s->top--;
        return x;
    } else {
        printf("ERROR: Stack underflow!\n");
        return -1;
    }
}

示例一

以下代码为一个示例程序,实现了对顺序栈的基本操作:

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

#define STACK_SIZE 5

typedef struct SeqStack {
    int *data;      // 栈的元素存储空间
    int size;       // 栈的大小
    int top;        // 栈顶指针
} SeqStack;

// 初始化栈
void initSeqStack(SeqStack *s, int size)
{
    s->data = (int*) malloc(sizeof(int) * size);
    s->size = size;
    s->top = -1;
}

// 判断栈是否为空
int isSeqStackEmpty(SeqStack *s)
{
    return s->top == -1;
}

// 判断栈是否已满
int isSeqStackFull(SeqStack *s)
{
    return s->top == s->size - 1;
}

// 入栈操作
void pushSeqStack(SeqStack *s, int x)
{
    if (!isSeqStackFull(s)) {
        s->top++;
        s->data[s->top] = x;
    } else {
        printf("ERROR: Stack overflow!\n");
    }
}

// 出栈操作
int popSeqStack(SeqStack *s)
{
    if (!isSeqStackEmpty(s)) {
        int x = s->data[s->top];
        s->top--;
        return x;
    } else {
        printf("ERROR: Stack underflow!\n");
        return -1;
    }
}

int main()
{
    SeqStack s;
    initSeqStack(&s, STACK_SIZE);

    pushSeqStack(&s, 1);
    pushSeqStack(&s, 2);
    pushSeqStack(&s, 3);
    printf("%d\n", popSeqStack(&s));        // output: 3
    printf("%d\n", popSeqStack(&s));        // output: 2
    pushSeqStack(&s, 4);
    pushSeqStack(&s, 5);
    pushSeqStack(&s, 6);            // output: ERROR: Stack overflow!
    printf("%d\n", popSeqStack(&s));        // output: 5
    printf("%d\n", popSeqStack(&s));        // output: 4
    printf("%d\n", popSeqStack(&s));        // output: 1
    printf("%d\n", popSeqStack(&s));        // output: ERROR: Stack underflow!

    return 0;
}

示例二

以下代码为一个示例程序,利用栈实现字符串的反转:

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

#define STACK_SIZE 100

typedef struct SeqStack {
    char *data;     // 栈的元素存储空间
    int size;       // 栈的大小
    int top;        // 栈顶指针
} SeqStack;

// 初始化栈
void initSeqStack(SeqStack *s, int size)
{
    s->data = (char*) malloc(sizeof(char) * size);
    s->size = size;
    s->top = -1;
}

// 判断栈是否为空
int isSeqStackEmpty(SeqStack *s)
{
    return s->top == -1;
}

// 判断栈是否已满
int isSeqStackFull(SeqStack *s)
{
    return s->top == s->size - 1;
}

// 入栈操作
void pushSeqStack(SeqStack *s, char x)
{
    if (!isSeqStackFull(s)) {
        s->top++;
        s->data[s->top] = x;
    } else {
        printf("ERROR: Stack overflow!\n");
    }
}

// 出栈操作
char popSeqStack(SeqStack *s)
{
    if (!isSeqStackEmpty(s)) {
        char x = s->data[s->top];
        s->top--;
        return x;
    } else {
        printf("ERROR: Stack underflow!\n");
        return '\0';
    }
}

int main()
{
    SeqStack s;
    initSeqStack(&s, STACK_SIZE);

    char str[] = "Hello, world!";
    int len = strlen(str);

    // 将字符串中的每个字符入栈
    for (int i = 0; i < len; i++) {
        pushSeqStack(&s, str[i]);
    }

    // 出栈并输出
    while (!isSeqStackEmpty(&s)) {
        printf("%c", popSeqStack(&s));
    }
    printf("\n");

    return 0;
}

运行上述程序,输出为:!dlrow ,olleH,即字符串被成功反转。

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

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

相关文章

  • golang常用加密解密算法总结(AES、DES、RSA、Sha1、MD5)

    Golang常用加密解密算法总结 Golang提供了丰富的加密解密算法库,本篇文章将介绍常用的加密解密算法:AES、DES、RSA、Sha1、MD5。 AES(Advanced Encryption Standard) AES加密算法是目前应用最广泛的对称加密算法,在网络传输中常作为对称加密方式使用。AES算法支持多种不同的密钥长度,包括128位,192位和…

    C 2023年5月23日
    00
  • C语言中如何进行线程和进程操作?

    C语言在操作系统中提供了一些库函数,可以方便地进行进程和线程的操作。 进程操作 创建新进程 使用 fork() 函数可以在当前进程中创建一个新进程。新进程继承了父进程的所有属性,但是父进程和子进程拥有独立的内存空间。下面是一个示例: #include <sys/types.h> #include <unistd.h> #include…

    C 2023年4月27日
    00
  • 超详细VScode调试教程tasks.json和launch.json的设置

    针对“超详细VScode调试教程tasks.json和launch.json的设置”的完整攻略,我将分为以下四个部分进行讲解: 简介 tasks.json的设置 launch.json的设置 示例说明 1. 简介 VScode是广受开发者欢迎的一款编辑器,其中调试功能让我们在开发过程中可以更直观地查看程序运行过程。而tasks.json和launch.jso…

    C 2023年5月23日
    00
  • Java中对list元素进行排序的方法详解

    首先我们需要知道,在Java中对List元素进行排序,我们通常会使用Collections类或者Stream API的sort()方法进行实现。 方法一:使用Collections类的sort()方法实现List元素排序 Collections类提供了sort()方法,在Java中使用该方法可以对List元素进行排序。该方法接收一个List类型的参数以及一个…

    C 2023年5月23日
    00
  • C语言比较字符串

    下面是详细讲解“C语言比较字符串”的完整使用攻略。 为什么需要比较字符串? 在程序中,需要对字符串进行比较的场景很常见。例如,能否登录的用户名和密码的验证,输入文本框中输入的内容是否符合要求等等。因此,字符串的比较是基础中的基础,是开发者必须熟练掌握的技能之一。 字符串比较的基本概念 C语言中,有一系列函数用于字符串比较。 我们先来认识一下这些函数: str…

    C 2023年5月9日
    00
  • vscode中launch.json和task.json配置教程(重要参数详解)

    接下来我会详细讲解“vscode中launch.json和task.json配置教程(重要参数详解)”的完整攻略,分为以下几部分: 一、 launch.json 1.1 什么是launch.json launch.json是Visual Studio Code配置文件之一,用于设置VS Code的调试器。 1.2 如何创建launch.json文件 在打开的…

    C 2023年5月23日
    00
  • C语言实现企业员工管理系统开发

    C语言实现企业员工管理系统开发攻略 1. 确定功能需求和数据结构 在开始编写代码之前,需要先确定功能需求和相应的数据结构。对于企业员工管理系统,通常需要包括以下功能: 添加员工 删除员工 修改员工信息 查询员工信息 显示员工列表 其中,员工的信息通常包括姓名、年龄、性别、职位等。根据这些需求,可以定义如下数据结构: // 定义 Employee 结构体,表示…

    C 2023年5月23日
    00
  • C++设计模式之组合模式

    C++设计模式之组合模式攻略 简介 组合模式(Composite Pattern)是一种结构型设计模式。组合模式可以将对象组合成树形结构,表示“部分-整体”的结构层次关系,让客户端统一对待单个对象和组合对象。 结构 组合模式将对象组织成树形结构,有以下三个角色: Component(抽象构件) 抽象构件定义了叶子和容器构件的公共接口,并可以提供一些默认的行为…

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