链栈的基本操作及实现

一、定义和特点

链栈是一种基于链表实现的栈,在链表头部作为栈顶,每次入栈和出栈时更改链表头的指向即可。链栈和数组栈相比,具有动态性和灵活性,不需要确定栈的最大长度,同时插入和删除元素的时间复杂度是O(1)。

二、栈的基本操作

1、初始化栈

(1)栈的数据结构

typedef struct StackNode
{
    int data;
    struct StackNode *next;
}StackNode, *LinkStackPtr;

typedef struct LinkStack
{
    LinkStackPtr top;
    int count;
}LinkStack;

(2)初始化函数实现

初始化需要分配一个头结点,将top指向NULL,表示栈为空。

void InitStack(LinkStack *S)
{
    S->top = (LinkStackPtr)malloc(sizeof(StackNode));
    S->top->next = NULL;
    S->count = 0;
}

2、判断栈空

当栈顶指针指向头结点时,说明栈为空。

bool StackEmpty(LinkStack S)
{
    return S.top->next == NULL;
}

3、入栈

每次在栈顶插入一个元素,需要注意顺序。

bool Push(LinkStack *S, int data)
{
    LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode));
    s->data = data;
    s->next = S->top->next;
    S->top->next = s;
    S->count++;
    return true;
}

4、出栈

每次从栈顶删除一个元素,并返回该元素的值。

bool Pop(LinkStack *S, int *data)
{
    if(StackEmpty(*S)) return false;

    LinkStackPtr p = S->top->next;
    S->top->next = p->next;
    *data = p->data;
    free(p);
    S->count--;
    return true;
}

5、获取栈顶元素值

只需要返回栈顶元素的值即可。

bool GetTop(LinkStack S, int *data)
{
    if(StackEmpty(S)) return false;

    *data = S.top->next->data;
    return true;
}

三、简单应用

下面是链栈的一个简单应用,判断括号序列是否合法。

bool BracketsMatch(char str[])
{
    LinkStack S;
    InitStack(&S);

    int i = 0;
    char c;
    while(str[i] != '\0')
    {
        switch(str[i])
        {
            case '(':
            case '[':
            case '{':
                Push(&S, str[i]);
                break;
            case ')':
            case ']':
            case '}':
                if(StackEmpty(S)) return false;
                Pop(&S, &c);
                if(str[i]-c != 1 && str[i]-c != 2) return false;
                break;
            default:
                break;
        }
        i++;
    }

    if(!StackEmpty(S)) return false;

    return true;
}

四、完整代码

#include 
#include 

typedef struct StackNode
{
    int data;
    struct StackNode *next;
}StackNode, *LinkStackPtr;

typedef struct LinkStack
{
    LinkStackPtr top;
    int count;
}LinkStack;

void InitStack(LinkStack *S)
{
    S->top = (LinkStackPtr)malloc(sizeof(StackNode));
    S->top->next = NULL;
    S->count = 0;
}

bool StackEmpty(LinkStack S)
{
    return S.top->next == NULL;
}

bool Push(LinkStack *S, int data)
{
    LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode));
    s->data = data;
    s->next = S->top->next;
    S->top->next = s;
    S->count++;
    return true;
}

bool Pop(LinkStack *S, int *data)
{
    if(StackEmpty(*S)) return false;

    LinkStackPtr p = S->top->next;
    S->top->next = p->next;
    *data = p->data;
    free(p);
    S->count--;
    return true;
}

bool GetTop(LinkStack S, int *data)
{
    if(StackEmpty(S)) return false;

    *data = S.top->next->data;
    return true;
}

bool BracketsMatch(char str[])
{
    LinkStack S;
    InitStack(&S);

    int i = 0;
    char c;
    while(str[i] != '\0')
    {
        switch(str[i])
        {
            case '(':
            case '[':
            case '{':
                Push(&S, str[i]);
                break;
            case ')':
            case ']':
            case '}':
                if(StackEmpty(S)) return false;
                Pop(&S, &c);
                if(str[i]-c != 1 && str[i]-c != 2) return false;
                break;
            default:
                break;
        }
        i++;
    }

    if(!StackEmpty(S)) return false;

    return true;
}

int main()
{
    LinkStack S;
    int x;
    InitStack(&S);
    Push(&S,1);
    Push(&S,2);
    Pop(&S,&x);
    printf("%d\n",x);
    GetTop(S, &x);
    printf("%d\n",x);

    char str[] = "[{(())}]";
    printf("%d\n", BracketsMatch(str));

    return 0;
}

原创文章,作者:EPJAJ,如若转载,请注明出处:https://www.506064.com/n/351709.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
EPJAJEPJAJ
上一篇 2025-02-17 17:02
下一篇 2025-02-17 17:02

相关推荐

  • Python栈操作用法介绍

    如果你是一位Python开发工程师,那么你必须掌握Python中的栈操作。在Python中,栈是一个容器,提供后进先出(LIFO)的原则。这篇文章将通过多个方面详细地阐述Pytho…

    编程 2025-04-29
  • Python基本索引用法介绍

    Python基本索引是指通过下标来获取列表、元组、字符串等数据类型中的元素。下面将从多个方面对Python基本索引进行详细的阐述。 一、列表(List)的基本索引 列表是Pytho…

    编程 2025-04-29
  • Python操作数组

    本文将从多个方面详细介绍如何使用Python操作5个数组成的列表。 一、数组的定义 数组是一种用于存储相同类型数据的数据结构。Python中的数组是通过列表来实现的,列表中可以存放…

    编程 2025-04-29
  • Python基本数字类型

    本文将介绍Python中基本数字类型,包括整型、布尔型、浮点型、复数型,并提供相应的代码示例以便读者更好的理解。 一、整型 整型即整数类型,Python中的整型没有大小限制,所以可…

    编程 2025-04-29
  • Python操作MySQL

    本文将从以下几个方面对Python操作MySQL进行详细阐述: 一、连接MySQL数据库 在使用Python操作MySQL之前,我们需要先连接MySQL数据库。在Python中,我…

    编程 2025-04-29
  • Python磁盘操作全方位解析

    本篇文章将从多个方面对Python磁盘操作进行详细阐述,包括文件读写、文件夹创建、删除、文件搜索与遍历、文件重命名、移动、复制、文件权限修改等常用操作。 一、文件读写操作 文件读写…

    编程 2025-04-29
  • Python代码实现回文数最少操作次数

    本文将介绍如何使用Python解决一道经典的回文数问题:给定一个数n,按照一定规则对它进行若干次操作,使得n成为回文数,求最少的操作次数。 一、问题分析 首先,我们需要了解回文数的…

    编程 2025-04-29
  • Python基本统计量计算

    本文将从多个方面详细介绍Python中基本统计量计算的方法。 一、均值 均值是一组数据的平均值,也就是将所有数据相加后再除以数据个数。 在Python中,可以使用numpy库中的m…

    编程 2025-04-29
  • Python程序的三种基本控制结构

    控制结构是编程语言中非常重要的一部分,它们指导着程序如何在不同的情况下执行相应的指令。Python作为一种高级编程语言,也拥有三种基本的控制结构:顺序结构、选择结构和循环结构。 一…

    编程 2025-04-29
  • Python元祖操作用法介绍

    本文将从多个方面对Python元祖的操作进行详细阐述。包括:元祖定义及初始化、元祖遍历、元祖切片、元祖合并及比较、元祖解包等内容。 一、元祖定义及初始化 元祖在Python中属于序…

    编程 2025-04-29

发表回复

登录后才能评论