日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode20.有效的括号——纯C

發布時間:2023/12/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode20.有效的括号——纯C 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

“尋尋覓覓冷冷清清凄凄慘慘戚戚”
“三杯兩盞淡酒,怎敵他晚來風急”

這道題是括號匹配問題,典型對 棧的應用的題目。

如何創建一個順序棧在前面的博文已經實現:傳送門。

題目描述

給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判斷字符串是否有效。

有效字符串需滿足:

  • 左括號必須用相同類型的右括號閉合。
  • 左括號必須以正確的順序閉合。
  • 題目鏈接

    LeetCode20. 有效的括號.簡單

    題目分析

    括號匹配問題,典型的對數據結構 棧的應用。
    以我現在初學數據結構的水平,LeetCode雖然表明它是個簡單題,但對我來說并不簡單,知識儲備量不夠多,用純C解決的話,很繁瑣。
    我的思路是先需要創建一個順序結構的棧,然后用棧的基本功能如:壓棧(StackPush),出棧(StackPop),得到棧頂的元素(StackTop)等功能 來完成這道題。

    思路:
    1.遍歷整個字符串“ ‘(’,’)’,’{’,’}’,’[’,’]’ ”。
    2.在遍歷的過程中如果遇到左括號’(’,或者’{’,或者’[’。進行壓棧操作(StackPush)。
    3.如果遇到右括號’)’,或者’}’,或者’]’,則進行訪問棧頂元素的值的操作(StackTop),如果棧頂的左括號和其中之一的右括號匹配,則進行出棧操作(StackPop)。
    4.直到字符串越界循環結束。

    代碼實現

    注意:在實現的過程中,需要注意極端情況。
    普通情況正常人都能想到。而極端情況就不一定了。
    而且題目的實例中可沒有給哦。
    1.假如只有一個左括號‘(’呢?
    //提示:只有一個左括號時,棧就不為空了。
    2.假如只有一個右括號‘)’呢?
    //提示:只有一個右括號時棧為空。

    /*********** *結構體創建 ***********/ typedef char STDataType;typedef struct Stack {STDataType* a;int top;int capacity; }ST; /*********** *函數的聲明 ***********///初始化結構體 void StackInit(ST* ps); //銷毀結構體 void StackDestroy(ST* ps); //壓棧 void StackPush(ST* ps, STDataType x); //出棧 void StackPop(ST* ps); //得到棧頂的值 STDataType StackTop(ST* ps); //判斷棧是否為空 bool StackEmpty(ST* ps); //得到棧的長度 int StackSize(ST* ps);/*********** *函數的定義 ***********///初始化結構體 void StackInit(ST* ps) {assert(ps);ps->a = NULL;ps->capacity = 0;ps->top = 0; } //銷毀結構體 void StackDestroy(ST* ps) {assert(ps);free(ps->a);ps->a = NULL;ps->capacity = 0;ps->top = 0;} //壓棧 void StackPush(ST* ps, STDataType x) {assert(ps);if (ps->top == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;STDataType* new = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapacity);if (new == NULL){printf("realloc fail\n");exit(-1);}ps->a = new;ps->capacity = newcapacity;}ps->a[ps->top] = x;ps->top++; } //出棧 void StackPop(ST* ps) {assert(ps);assert(ps->top > 0);ps->top--; } //訪問棧頂元素 STDataType StackTop(ST* ps) {assert(ps);assert(ps->top > 0);return ps->a[ps->top - 1]; } //判斷棧是否為空 bool StackEmpty(ST* ps) {assert(ps);return ps->top == 0; } //得到棧的長度 int StackSize(ST* ps) {assert(ps);return ps->top; }/*********** *題目函數接口 ***********/ bool isValid(char* s) {ST st;//創建棧,否則后續壓棧等操作無法實現StackInit(&st);while (*s){if (*s == '(' || *s == '{' || *s == '['){StackPush(&st, *s);s++;}else{//只有一個右括號時,棧為空。直接return falseif (StackEmpty(&st)){return false;}char top = StackTop(&st);if (*s == ')' && top == '(' || *s == '}' && top == '{' || *s == ']' && top == '['){StackPop(&st);s++;}else{return false;}}}//處理只有一個左括號if (!StackEmpty(&st)){return false;}return true;//銷毀棧,拒絕內存泄漏StackDestroy(&st); }

    總結

    以上是生活随笔為你收集整理的LeetCode20.有效的括号——纯C的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。