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

yizhihongxing

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

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++类对象的创建与使用 示例说明 C++类的定义与声明 C++中可以使用class关键字来定义类,通常情况下类定义和声明会放在.h文件中,具体代码如下: // MyClass.h class MyClass { public: voi…

    C 2023年5月23日
    00
  • C语言必背的一些经典程序代码实例

    下面是关于“C语言必背的一些经典程序代码实例”的详细攻略。 一、为什么要学习经典程序代码实例 首先,要了解为什么要学习经典程序代码实例。经典程序代码实例是经过大量实践、考验的优秀程序代码,不仅可以让我们了解基本的编程思路和实现方法,同时也可以拓展我们的编程思维,提高我们的编程能力。 二、经典程序代码实例的分类 常见的经典程序代码实例可以分为以下几类: 算法:…

    C 2023年5月23日
    00
  • JS ES新特性之变量的解耦赋值

    首先,我们需要了解变量解耦赋值的概念。在 ES6 中,可以通过解构表达式将一个数据结构中的值,赋值到一个或多个变量中,这种方式被称为“解耦赋值”。 下面我们通过两个示例来详细说明这个概念。 示例一:对象解耦赋值 对象解耦赋值指的是根据对象的属性名,将属性值解构赋值给变量。 const person = { name: ‘Jack’, age: 20, sex…

    C 2023年5月23日
    00
  • C语言超详细讲解文件的操作

    一、文件的操作 在C语言中,文件是通过文件指针来进行操作的,每打开一个文件都有一个对应的文件指针,这个指针指向文件中当前指针所在的位置。文件指针在初始化时会指向文件开始处。 二、文件指针的操作 在C语言中,FILE类型是对文件指针进行封装的结构体类型。 文件指针操作常用的函数包括: fopen (file open) :打开文件 fclose (file c…

    C 2023年5月23日
    00
  • C 程序 计算等边三角形的面积

    以下是详细讲解“C程序计算等边三角形的面积”的完整使用攻略。 程序介绍 这是一个使用C语言编写的计算等边三角形面积的程序。输入三角形的边长,即可计算出三角形的面积。 程序代码 #include <stdio.h> #include <math.h> int main() { float a, area; printf("En…

    C 2023年5月9日
    00
  • C语言实现计算器的两种方法

    当下常见编程语言中,C语言是一种十分常用的语言。C语言可以用来开发各种类型的应用、系统和游戏,其中之一就是实现计算器。下面将结合两条示例来详细讲解“C语言实现计算器的两种方法”的完整攻略。 第一种方法:基于表达式求值的计算机实现 思路分析 在程序开发者社区中,基于表达式求值的方式是最广泛使用的方法之一。下面是一个实现“基于表达式求值的计算机”的思路: 读入表…

    C 2023年5月23日
    00
  • C/C++ Linux Socket网络编程流程分析

    C/C++ Linux Socket网络编程流程分析 什么是Socket Socket是计算机网络中对于通信队列和编程接口的抽象。一句话概括,Socket是一种特殊的文件,它通过文件IO的方式向网络发送和接收数据。 Socket网络编程流程 创建Socket 创建一个Socket需要调用socket()函数,它有三个参数,分别是:地址族、类型、协议。在Lin…

    C 2023年5月23日
    00
  • C#中[]的几种用法示例代码

    下面是《C#中[]的几种用法示例代码》的完整攻略,希望能对你有所帮助。 简介 中括号 [] 在 C# 中有多种用法,包括声明数组、索引器、指针等。在学习 C# 时,理解这些用法非常重要。 用法一:声明数组 在 C# 中,可以使用中括号 [] 来声明数组。以下是一个将整数存储在数组中的示例: int[] numbers = { 1, 2, 3, 4 }; 在上…

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