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日

相关文章

  • C语言 二级指针详解及示例代码

    我会为你讲解如何撰写“C语言 二级指针详解及示例代码”的完整攻略。 C语言 二级指针详解及示例代码 什么是二级指针? 在C语言中,指针是一种非常重要的数据类型。通过指针可以访问内存中的任何数据。指针也可以指向指针,这种指针称之为二级指针。简单地说,二级指针就是一个指向指针的指针。 声明二级指针 声明二级指针的方式与声明一级指针的方式类似,只需要在指针类型前面…

    C 2023年5月24日
    00
  • GoLang之标准库encoding/json包

    请看以下内容,我将详细讲解“GoLang之标准库encoding/json包”的完整攻略。 GoLang之标准库encoding/json包攻略 标准库encoding/json包提供了一组用于将数据编码为JSON格式并解码JSON数据的函数。本攻略将介绍它的用法,并示范解码和编码JSON数据的例子。 什么是JSON JSON(JavaScript Obje…

    C 2023年5月23日
    00
  • win10激活出现0xc0020036怎么解决?

    解决Win10激活错误码0xc0020036 问题描述 在尝试激活Windows 10时,可能遇到错误码0xc0020036。这意味着您无法激活Windows,不能使用所有Win10的功能。该错误是由于软件许可证助手(SLUI)进程出现错误导致的。许多用户在尝试激活Windows时会遇到此错误。该问题可能是由于以下原因导致: 无法连接到许可证服务器 未知错误…

    C 2023年5月23日
    00
  • VC6.0常用快捷键大全

    VC6.0常用快捷键大全 为什么需要快捷键? 在编程的过程中,我们需要频繁地进行复制、粘贴、撤销等操作。如果每次都使用鼠标进行操作,效率会非常低下。而快捷键的存在,可以极大地提高我们的工作效率。以下是VC6.0中的一些常用快捷键。 快捷键列表 常用快捷键 Ctrl + S 保存当前文件 Ctrl + C 复制选中内容 Ctrl + V 粘贴剪贴板内容 Ctr…

    C 2023年5月23日
    00
  • 基于条件变量的消息队列 说明介绍

    基于条件变量的消息队列是一种进程间通信机制,适用于多线程环境。在使用过程中,需要注意线程同步和互斥的问题。 什么是条件变量 条件变量是线程间同步的一种方式,线程可以调用它的wait()方法将自己阻塞,直到其他线程调用signal()方法才能重新运行。条件变量常和互斥锁配合使用,锁用来保护数据,条件变量用来等待特定条件的发生。 消息队列 消息队列是一种消息传递…

    C 2023年5月22日
    00
  • 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
  • 中国式家长特长有哪些 特长种类及品质一览

    中国式家长特长有哪些 1. 家长特长一览 中国式家长的特长主要包括以下领域: 学术特长:对学术成果有着强烈的追求,希望自己的孩子在学术上有所突出。 才艺特长:对于音乐、美术、舞蹈、书法等领域有一定的天赋或爱好,希望孩子能够在这方面有所发展。 运动特长:注重体育锻炼,希望孩子在体育运动领域能够有所表现。 社交特长:去关注孩子的人际关系及社交技巧。 实用特长: …

    C 2023年5月22日
    00
  • 浅谈Gin框架中bind的使用

    下面是关于在Gin框架中使用bind的攻略。 什么是bind 在Gin框架中,你可以使用bind来绑定请求的内容到指定的结构体上。如果请求传过来的参数符合结构体中定义的字段类型和名称,那么bind操作就可以将这些参数值绑定到对应的结构体字段上,从而方便我们在后续的处理中使用。bind可以用于解析请求的body、header、query等多种方式获取的参数。 …

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