鏈棧的基本操作及實現

一、定義和特點

鏈棧是一種基於鏈表實現的棧,在鏈表頭部作為棧頂,每次入棧和出棧時更改鏈表頭的指向即可。鏈棧和數組棧相比,具有動態性和靈活性,不需要確定棧的最大長度,同時插入和刪除元素的時間複雜度是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/zh-hant/n/351709.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
EPJAJ的頭像EPJAJ
上一篇 2025-02-17 17:02
下一篇 2025-02-17 17:02

相關推薦

  • Python棧操作用法介紹

    如果你是一位Python開發工程師,那麼你必須掌握Python中的棧操作。在Python中,棧是一個容器,提供後進先出(LIFO)的原則。這篇文章將通過多個方面詳細地闡述Pytho…

    編程 2025-04-29
  • Python操作數組

    本文將從多個方面詳細介紹如何使用Python操作5個數組成的列表。 一、數組的定義 數組是一種用於存儲相同類型數據的數據結構。Python中的數組是通過列表來實現的,列表中可以存放…

    編程 2025-04-29
  • Python基本索引用法介紹

    Python基本索引是指通過下標來獲取列表、元組、字符串等數據類型中的元素。下面將從多個方面對Python基本索引進行詳細的闡述。 一、列表(List)的基本索引 列表是Pytho…

    編程 2025-04-29
  • Python基本數字類型

    本文將介紹Python中基本數字類型,包括整型、布爾型、浮點型、複數型,並提供相應的代碼示例以便讀者更好的理解。 一、整型 整型即整數類型,Python中的整型沒有大小限制,所以可…

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

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL數據庫 在使用Python操作MySQL之前,我們需要先連接MySQL數據庫。在Python中,我…

    編程 2025-04-29
  • Python代碼實現迴文數最少操作次數

    本文將介紹如何使用Python解決一道經典的迴文數問題:給定一個數n,按照一定規則對它進行若干次操作,使得n成為迴文數,求最少的操作次數。 一、問題分析 首先,我們需要了解迴文數的…

    編程 2025-04-29
  • Python磁盤操作全方位解析

    本篇文章將從多個方面對Python磁盤操作進行詳細闡述,包括文件讀寫、文件夾創建、刪除、文件搜索與遍歷、文件重命名、移動、複製、文件權限修改等常用操作。 一、文件讀寫操作 文件讀寫…

    編程 2025-04-29
  • Python基本統計量計算

    本文將從多個方面詳細介紹Python中基本統計量計算的方法。 一、均值 均值是一組數據的平均值,也就是將所有數據相加後再除以數據個數。 在Python中,可以使用numpy庫中的m…

    編程 2025-04-29
  • Python程序的三種基本控制結構

    控制結構是編程語言中非常重要的一部分,它們指導着程序如何在不同的情況下執行相應的指令。Python作為一種高級編程語言,也擁有三種基本的控制結構:順序結構、選擇結構和循環結構。 一…

    編程 2025-04-29
  • Python元祖操作用法介紹

    本文將從多個方面對Python元祖的操作進行詳細闡述。包括:元祖定義及初始化、元祖遍歷、元祖切片、元祖合併及比較、元祖解包等內容。 一、元祖定義及初始化 元祖在Python中屬於序…

    編程 2025-04-29

發表回復

登錄後才能評論