C语言对栈的实现基本操作

下面我将详细讲解“C语言对栈的实现基本操作”的完整攻略。

栈的基本概念

栈是一种数据结构,是一种只允许在一端进行插入删除操作的线性表,这一端称为栈顶,另一端称为栈底。遵循后进先出(LIFO)的原则,即最后插入的元素最先弹出。

栈的操作

栈的基本操作包括初始化、入栈、出栈、获取栈顶元素以及判断栈是否为空。下面分别进行详细介绍:

初始化栈

初始化栈即为给栈分配空间,初始化栈顶和栈底指针。C 语言中用结构体定义一个栈,初始化时使用 malloc 分配结构体大小的内存,并将栈顶指针和栈底指针置为空。

#include <stdlib.h>

#define MAXSIZE 100

typedef struct {
    int data[MAXSIZE];
    int top; // 栈顶指针
} Stack;

void init(Stack *s) {
    s=(Stack*)malloc(sizeof(Stack));
    s->top=-1;
}

入栈

入栈即在栈顶插入一个元素。当栈未满时,插入元素,并将栈顶指针指向该元素;若栈已满,则输出提示信息。

void push(Stack *s, int value) {
    if(s->top==MAXSIZE-1) {
        printf("Stack overflow.");
        return;
    }
    s->data[++s->top]=value;
}

出栈

出栈即弹出栈顶元素。当栈非空时,弹出栈顶元素并将栈顶指针下移一个位置;若栈为空,则输出提示信息。

int pop(Stack *s) {
    if(s->top==-1) {
        printf("Stack underflow.");
        return -1;
    }
    return s->data[s->top--];
}

获取栈顶元素

获取栈顶元素即查看栈顶元素的值。当栈非空时,返回栈顶元素的值;若栈为空,则输出提示信息。

int top(Stack *s) {
    if(s->top==-1) {
        printf("Stack underflow.");
        return -1;
    }
    return s->data[s->top];
}

判断栈是否为空

判断栈是否为空即查看栈顶指针是否为 -1。当栈为空时,返回 1;否则返回 0。

int isEmpty(Stack *s) {
    return s->top==-1;
}

示例说明

示例一

假设当前栈中元素为 {1, 2, 3, 4},现需将栈中全部元素出栈并输出。则代码如下:

#include <stdio.h>

int main() {
    Stack s;
    init(&s);
    int num;
    push(&s, 1);
    push(&s, 2);
    push(&s, 3);
    push(&s, 4);
    while(!isEmpty(&s)) {
        num=pop(&s);
        printf("%d ",num);
    }
    return 0;
}

结果输出为:

4 3 2 1

示例二

现在需要判断一个字符串中的括号是否匹配。例如,字符串 "((()))" 是合法的,而字符串 "(()" 是不合法的。则代码如下:

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

int main() {
    Stack s;
    init(&s);
    char str[50];
    int i,flag=1;
    printf("请输入要判断的字符串:");
    scanf("%s",str);
    for(i=0;i<strlen(str);i++) {
        if(str[i]=='(') {
            push(&s,i);
        }
        if(str[i]==')'&&!isEmpty(&s)) {
            pop(&s);
        }
        else if(str[i]==')'&&isEmpty(&s)) {
            flag=0;
            break;
        }
    }
    if(!isEmpty(&s)) {
        flag=0;
    }
    if(flag) {
        printf("该字符串是合法的.");
    }
    else {
        printf("该字符串是不合法的.");
    }
    return 0;
}

运行结果为:

请输入要判断的字符串:((()))
该字符串是合法的.
请输入要判断的字符串:(())
该字符串是不合法的.

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

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

相关文章

  • C#中使用SQLite数据库的方法介绍

    C#中使用SQLite数据库的方法介绍 什么是SQLite数据库? SQLite是一个轻量级的、开源的、关系型数据库管理系统(RDBMS)。 它包括C库、命令行工具和多种语言的API,主要使用在嵌入式设备和小型应用程序中。 SQLite不需要单独的服务器进程或者操作系统的支持,因为SQLite直接在应用程序中存储数据。 在C#中使用SQLite数据库的方法 …

    C 2023年5月22日
    00
  • 用C++编写扩展node.js(node-ffi版)

    编写扩展是Node.js的一大特色,可用于使用C/C++或其他语言来扩展Node.js核心功能或为Node.js实现第三方模块。其中,Node.js提供了两个核心库,即N-API和node-gyp,可以让我们更加方便地编写扩展。另外,node-ffi是另一款非常流行的编写扩展的库。下面,我们就来具体讲解如何使用C++编写扩展node.js(node-ffi版…

    C 2023年5月23日
    00
  • C++ 中const对象与const成员函数的实例详解

    下面是对 “C++ 中const对象与const成员函数的实例详解” 的详细讲解: 什么是 const 对象? const 对象:指一旦被初始化后就不能被修改的对象。 const 对象必须在创建时进行初始化,因为一旦创建后就不能再改变它的值。 访问一个 const 对象的地址是完全合法的。 普通的 const 对象 看以下代码示例: #include &lt…

    C 2023年5月22日
    00
  • C++实现简易计算器功能

    下面是C++实现简易计算器功能的攻略: 1. 确定计算器的功能 在开始实现计算器之前,我们需要明确计算器的功能要求,例如要支持哪些运算符、如何处理优先级等等。一个常见的简易计算器需要支持加减乘除四种基本运算,可以不考虑优先级问题。 2. 选择合适的数据结构 在C++中实现计算器,我们可以使用stack(栈)来存储数字和运算符。具体来说,我们可以定义两个栈,一…

    C 2023年5月23日
    00
  • C++ vector的简单实现

    C++ vector的简单实现 在C++中,vector是一种非常常用的容器,它能够动态地保存一组元素(比如整数、浮点数以及自定义类型等)。在本文中,我们将分步讲解如何实现一个简单的vector。 步骤1:定义类和变量 我们首先要定义一个vector类,它可以保存任意类型的元素,使用template<typename T>来定义: templat…

    C 2023年5月23日
    00
  • Go 使用Unmarshal将json赋给struct出错的原因及解决

    问题描述 在使用Go语言的Unmarshal函数将json数据赋给struct时,可能会遇到一些出错的情况。 下面是一个例子: package main import ( "encoding/json" "fmt" ) type Person struct { Name string Age int } func ma…

    C 2023年5月23日
    00
  • C语言 strspn()函数

    当我们需要检测两个字符串之间共有的字符时,可以使用C语言的strspn()函数。该函数返回字符串中的字符数目,直到字符串中的第一个不属于目标字符集合的字符(即停止搜索的字符)被检测到。以下是关于该函数的详细使用攻略。 函数原型 size_t strspn(const char *str1, const char *str2); 该函数接受两个参数:str1和…

    C 2023年5月9日
    00
  • C语言如何在指针中隐藏数据详解

    一、什么是C语言指针的隐藏数据 在C语言中,指针可以用来访问变量在内存中的地址。一般情况下,我们使用指针来直接访问、修改该变量的值。但是,指针本身也是一个变量,也可以被赋值,并被存储到内存中。因此,我们可以通过将数据(例如,一个结构体)存储到指针中来隐藏数据。 二、如何在指针中隐藏数据 我们可以使用结构体类型和typedef定义指针类型,以便在指针中保存结构…

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