<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      筆試題:C語言使用順序棧判斷字符串中的括號有效性

      一、背景介紹

      通過鍵盤輸入一個包括 '(' 和 ')' 的字符串string ,判斷字符串是否有效。要求設計算法實現檢查字符串是否有效,有效的字符串需滿足以下條件:
      A. 左括號必須用相同類型的右括號閉合。
      B. 左括號必須以正確的順序閉合。
      C. 每個右括號都有一個對應的相同類型的左括號。

      我們可以利用 順序棧(Sequence Stack)來解決這個問題,因為棧結構可以有效地跟蹤括號的匹配關系。順序棧是一個靜態實現的棧數據結構,它通過數組實現棧的各項操作,具有較高的時間和空間效率。

      本文將介紹如何使用順序棧來判斷括號是否有效,以下是解決該問題的詳細步驟。

      二、算法設計

      解決括號匹配問題的基本思路如下:

      1. 入棧操作
        • 當遇到左括號 ( 時,將其壓入棧中。
      2. 出棧操作
        • 當遇到右括號 ) 時,從棧中彈出棧頂元素。
        • 如果棧為空,表示沒有對應的左括號,返回無效。
        • 如果彈出的棧頂元素是左括號 (,繼續判斷下一個字符。
      3. 結束后檢查棧是否為空
        • 如果棧不為空,說明有未匹配的左括號,返回無效。
        • 如果棧為空,表示所有括號均有效,返回有效。

      版本:

      /**
       * @file name : SeqenceIsStrVaild.c
       * @brief     : 通過鍵盤輸入一個包括 '(' 和 ')' 的字符串string ,判斷字符串是否有效。要求設計算法實現檢查字符串是否有效,有效的字符串需滿足以下條件:
      A. 左括號必須用相同類型的右括號閉合。
      B. 左括號必須以正確的順序閉合。
      C. 每個右括號都有一個對應的相同類型的左括號。
       * @author    : qrshxc@163.com
       * @date      : 2025/04/26
       * @version   : 1.0
       * @note      : 
       * CopyRight (c)  2025-2026   qrshxc@163.com   All Right Reseverd
       */
      

      三、順序棧的實現

      順序棧是一種通過數組實現的棧數據結構,通常需要維護三個基本操作:入棧、出棧、檢查棧是否為空。

      1. 順序棧的定義

      我們首先定義順序棧的結構體 SeqStack_t,包括棧底指針、棧容量和棧頂指針。

      c復制編輯typedef char DataType_t; // 棧數據類型
      
      // 順序棧結構體定義
      typedef struct SequenceStack
      {
          DataType_t *bottom;  // 記錄順序棧棧底地址
          unsigned int size;   // 記錄順序棧棧容量大小
          int top;             // 記錄順序棧棧頂元素的下標
      } SeqStack_t;
      

      2. 順序棧的基本操作

      順序棧的基本操作包括:棧創建、入棧、出棧、判斷棧是否為空。

      #include <stdio.h>
      #include <stdlib.h>
      #include <stdbool.h>
      
      // 順序棧的數據類型
      typedef char DataType_t;
      
      // 順序棧的結構體定義
      typedef struct SequenceStack
      {
          DataType_t *bottom;  // 記錄順序棧棧底地址
          unsigned int size;   // 記錄順序棧棧容量大小
          int top;             // 記錄順序棧棧頂元素的下標
      } SeqStack_t;
      
      /**
       * @name      SeqStack_create
       * @brief     創建順序棧并對順序棧進行初始化
       * @param     size 順序棧的大小
       * @return
       *      @retval    manager 順序棧的管理結構體
       * @date      2025/04/24
       * @version   1.0
       * @note      Manager->Addr  --->  [Size*sizeof(DataType_t)]
       */
      SeqStack_t *SeqStack_create(unsigned size)
      {
          // 1. 利用 calloc 為棧的管理結構體分配內存
          SeqStack_t *manager = (SeqStack_t *)calloc(1, sizeof(SeqStack_t));
          // 錯誤處理:如果內存分配失敗
          if (manager == NULL) {
              perror("calloc memory for manager failed!");
              exit(-1); // 程序異常終止
          }
      
          // 2. 利用 calloc 為棧底(數組)分配內存
          manager->bottom = (DataType_t *)calloc(size, sizeof(DataType_t));
          // 錯誤處理:如果內存分配失敗
          if (manager->bottom == NULL) {
              perror("calloc memory for bottom failed!");
              free(manager);
              exit(-1);
          }
      
          // 3. 初始化棧的容量和棧頂指針
          manager->size = size;
          manager->top = -1; // 棧頂指針初始化為 -1,表示棧為空
      
          return manager;
      }
      
      /**
       * @name      SeqStack_IsFull
       * @brief     判斷順序棧是否已滿
       * @param     manager 順序棧的管理結構體
       * @return
       *      @retval true 棧已滿
       *      @retval false 棧未滿
       * @date      2025/04/24
       * @version   1.0
       * @note      判斷棧的棧頂是否已經達到了棧的容量
       */
      bool SeqStack_IsFull(SeqStack_t *manager)
      {
          // 如果棧頂元素的下標等于棧的容量減1,說明棧已滿
          return manager->top + 1 == manager->size ? true : false;
      }
      
      /**
       * @name      SeqStack_Push
       * @brief     入棧
       * @param     data 插入的元素
       * @return
       *      @retval true 入棧成功
       *      @retval false 入棧失敗
       * @date      2025/04/24
       * @version   1.0
       * @note      判斷棧是否已滿,如果沒滿則將數據壓入棧頂
       */
      bool SeqStack_Push(SeqStack_t *manager, DataType_t data)
      {
          // 判斷順序棧是否已滿
          if (SeqStack_IsFull(manager)) {
              printf("SequenceStack is full!\n");
              return false;
          }
          // 如果棧未滿,則將數據壓入棧頂
          manager->bottom[++manager->top] = data;
          return true;
      }
      
      /**
       * @name      SeqStack_IsEmpty
       * @brief     判斷順序棧是否為空
       * @param     manager 順序棧的管理結構體
       * @return
       *      @retval true 棧為空
       *      @retval false 棧不為空
       * @date      2025/04/24
       * @version   1.0
       * @note      判斷棧的棧頂指針是否為 -1,表示棧為空
       */
      bool SeqStack_IsEmpty(SeqStack_t *manager)
      {
          return (manager->top == -1) ? true : false;
      }
      
      /**
       * @name      SeqStack_Pop
       * @brief     出棧
       * @param     manager 順序棧的管理結構體
       * @return
       *      @retval temp 出棧的值
       * @date      2025/04/24
       * @version   1.0
       * @note      判斷棧是否為空,如果棧不為空,則彈出棧頂元素
       */
      DataType_t SeqStack_Pop(SeqStack_t *manager)
      {
          DataType_t temp = 0; // 用于存儲出棧的元素
      
          // 判斷順序棧是否為空
          if (SeqStack_IsEmpty(manager)) {
              printf("SequenceStack is empty!\n");
              return -1; // ??諘r返回特殊錯誤值
          }
      
          // 彈出棧頂元素并更新棧頂指針
          temp = manager->bottom[manager->top--];
          return temp;
      }
      
      /**
       * @name      SeqStack_IsStrVaild
       * @brief     判斷字符串中的括號是否有效,支持小括號 '(' 和 ')'
       * @param     manager 順序棧的管理結構體
       * @param     str 待檢查的字符串
       * @return
       *      @retval true 字符串有效
       *      @retval false 字符串無效
       * @date      2025/04/24
       * @version   1.0
       * @note      遍歷字符串,遇到左括號壓棧,遇到右括號彈棧,判斷括號是否匹配
       */
      bool SeqStack_IsStrVaild(SeqStack_t *manager, const char *str)
      {
          char *pstr = (char *)str; // 備份str地址
      
          // 遍歷字符串中的每個字符
          while (*pstr != '\0') {
              if (*pstr == '(') {  // 如果是左括號 '(', 入棧
                  SeqStack_Push(manager, '(');
              } else if (*pstr == ')') {  // 如果是右括號 ')', 出棧
                  if (SeqStack_IsEmpty(manager)) {  // 判斷棧是否為空
                      return false;  // ??諘r,表示沒有左括號匹配
                  }
                  SeqStack_Pop(manager);  // 彈出棧頂元素(左括號)
              }
              pstr++;  // 移動到下一個字符
          }
      
          // 如果棧不為空,表示有未匹配的左括號
          return SeqStack_IsEmpty(manager);
      }
      
      /**
       * @name      SeqStack_Print
       * @brief     從頭到尾遍歷順序棧的元素
       * @param     manager 順序棧的管理結構體
       * @return
       *      @retval    
       * @date      2025/04/24
       * @version   1.0
       * @note      遍歷棧中的元素并打印
       */
      void SeqStack_Print(SeqStack_t *manager)
      {
          for (int i = 0; i <= manager->top; ++i) {
              printf("Stack Element[%d] = %d\n", i, manager->bottom[i]);  // 打印順序棧單元數據
          }
      }
      
      int main(int argc, char const *argv[])
      {
          // 創建一個順序棧,棧大小為5
          SeqStack_t *stack = SeqStack_create(5);
      
          // 測試用例 1
          const char *str1 = "(())";
          if (SeqStack_IsStrVaild(stack, str1)) {
              printf("字符串 \"%s\" 是有效的。\n", str1);
          } else {
              printf("字符串 \"%s\" 是無效的。\n", str1);
          }
      
          // 測試用例 2
          const char *str2 = "(()";
          if (SeqStack_IsStrVaild(stack, str2)) {
              printf("字符串 \"%s\" 是有效的。\n", str2);
          } else {
              printf("字符串 \"%s\" 是無效的。\n", str2);
          }
      
          // 清理棧的內存
          free(stack->bottom); // 釋放棧底的內存
          free(stack); // 釋放棧的管理結構體內存
      
          return 0;
      }
      
      

      3. 判斷括號是否有效

      使用順序棧來檢查括號是否匹配有效,我們在遍歷字符串的過程中,遇到左括號時壓棧,遇到右括號時彈棧。

      c復制編輯// 判斷括號匹配是否有效
      bool SeqStack_IsStrVaild(SeqStack_t *manager, const char *str)
      {
          const char *pstr = str;
          while (*pstr != '\0') {
              if (*pstr == '(') {
                  SeqStack_Push(manager, '(');  // 左括號入棧
              } else if (*pstr == ')') {
                  if (SeqStack_IsEmpty(manager)) {
                      return false;  // 棧空時表示沒有左括號匹配
                  }
                  SeqStack_Pop(manager);  // 彈出棧頂元素(左括號)
              }
              pstr++;
          }
      
          // 如果棧不為空,表示有未匹配的左括號
          return SeqStack_IsEmpty(manager);
      }
      

      四、測試用例

      接下來,我們通過幾個測試用例來驗證我們的實現。

      c復制編輯int main()
      {
          SeqStack_t *stack = SeqStack_create(100);  // 創建棧,容量為100
      
          // 測試用例 1
          const char *str1 = "(())";
          if (SeqStack_IsStrVaild(stack, str1)) {
              printf("字符串 \"%s\" 是有效的。\n", str1);
          } else {
              printf("字符串 \"%s\" 是無效的。\n", str1);
          }
      
          // 測試用例 2
          const char *str2 = "(()";
          if (SeqStack_IsStrVaild(stack, str2)) {
              printf("字符串 \"%s\" 是有效的。\n", str2);
          } else {
              printf("字符串 \"%s\" 是無效的。\n", str2);
          }
      
        
      

      測試結果:

      • 測試用例 1(()) 輸出:字符串 "(())" 是有效的。
      • 測試用例 2(() 輸出:字符串 "(()" 是無效的。
      字符串 "(())" 是有效的。
      字符串 "(()" 是無效的。
      

      五、總結

      通過使用順序棧,我們能夠高效地判斷一個字符串中的括號是否有效。棧的先進后出(LIFO)特性使得我們能夠從棧中彈出并檢查每個左括號是否匹配相應的右括號。該方法可以擴展到更復雜的括號類型(如 {}[]),并適用于其他類似的匹配問題。

      本文通過順序棧的實現展示了如何處理括號匹配問題,希望對你有所幫助。

      posted @ 2025-04-28 16:45  九思0404  閱讀(26)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产不卡av一区二区| 综合激情网一区二区三区| 精品一区二区三人妻视频| 成人伊人青草久久综合网| 国产盗摄视频一区二区三区| 精品国产高清中文字幕| 无套内谢少妇一二三四| 一日本道伊人久久综合影| 青青草无码免费一二三区| 无码人妻精品一区二区三区东京热| 无线乱码一二三区免费看| 青草成人精品视频在线看| 国产成人高清亚洲综合| 18禁无遮挡啪啪无码网站| 一本精品99久久精品77| 无遮高潮国产免费观看| 国产亚洲人成网站在线观看 | 成人精品老熟妇一区二区| 无遮高潮国产免费观看| 亚洲鸥美日韩精品久久| 久久精品色妇熟妇丰满人| 国产av一区二区午夜福利| 18禁无遮挡啪啪无码网站破解版| 国产视频一区二区在线看| 人妻丝袜无码专区视频网站| 欧洲中文字幕一区二区| 人妻中文字幕av资源站| 亚洲天堂av 在线| 成人中文在线| 精品亚洲国产成人性色av| 国产精品毛片一区视频播| 性欧美三级在线观看| 国产精品综合av一区二区| 强奷白丝美女在线观看| 成人网站免费在线观看| 国产三级精品三级在线区| 亚洲国产高清在线观看视频| 国精品午夜福利视频不卡| 国产中文三级全黄| 国产精品人妻一码二码尿失禁 | 丰满少妇又爽又紧又丰满在线观看|