首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C 語言實現鏈棧與括號匹配應用詳解

     編輯:關於C++

鏈棧數據結構設計

採用帶頭結點的單鏈表實現棧,頭結點不存數據,next 指向棧頂元素。結構定義:

typedef char DataType;
typedef struct node {
    DataType data;
    struct node *next;
} LStackNode, *LinkStack;

核心操作實現

操作關鍵邏輯時間複雜度
初始化分配頭結點,next = NULLO(1)
判空檢查 top->next == NULLO(1)
進棧新結點插入頭結點之後,p->next = top->next; top->next = p;O(1)
出棧刪除首元結點,top->next = p->next; free(p);O(1)
取棧頂返回首元結點數據,不刪除O(1)
求長度遍歷鏈表計數O(n)
銷毀逐個釋放結點O(n)

應用示例:括號匹配驗證

利用棧的後進先出特性,遇左括號進棧,遇右括號檢查棧頂是否為對應左括號:

int Match(DataType e, DataType ch) {
    return (e=='('&&ch==')') || (e=='['&&ch==']') || (e=='{'&&ch=='}');
}

void main_Match() {
    LinkStack S; InitStack(&S);
    char ch[100]; gets(ch);
    char *p = ch;
    while (*p) {
        switch(*p) {
            case '(': case '[': case '{': PushStack(S, *p++); break;
            case ')': case ']': case '}':
                if (StackEmpty(S)) { printf("缺少左括號.\n"); return; }
                GetTop(S, &e);
                if (Match(e, *p)) PopStack(S, &e);
                else { printf("左右括號不配對.\n"); return; }
                p++; break;
            default: p++;
        }
    }
    if (StackEmpty(S)) printf("括號匹配.\n");
    else printf("缺少右括號.\n");
}

優勢與擴展

  • 動態分配,無固定容量限制。
  • 可擴展為通用模板,支持任意數據類型。
  • 括號匹配邏輯可直接用於編譯器詞法分析階段。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved