括号匹配的判定----《数据结构》

本文介绍了一种使用栈数据结构来验证括号是否正确配对的方法。通过定义一系列栈操作函数,如初始化栈、压栈、弹栈等,并结合两个判断函数辅助验证括号类型及其合法性,最终实现了对输入字符串中括号的匹配检查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>  
#include<malloc.h>  
#include<stdlib.h>  
#include<string.h> 

typedef struct{
    char *base;
    char *top;
    int stacksize;
}SqStack; 

int InitStack(SqStack &S){
    S.base = (char *)malloc(100*sizeof(char));
    if(!S.base){
        printf("储存空间分配失败");
        exit(-2);
    }
    S.top = S.base;
    S.stacksize = 100;
    return 1;
}

char GetTop(SqStack S){
    if(S.top!=S.base)
 
    return *(S.top-1); 
}
int Push(SqStack &S,char e){
    if(S.top-S.base==S.stacksize){
        return 0; 
    }
    
    *S.top++ = e;
    return 1;
}
int Pop(SqStack &S,char &e){
    if(S.base!=S.top)
    e = *--S.top;
    return 1;
}
int Judge(char e){
    if(e=='('||e==')'||e=='['||e==']')
        return 1;
    return 0;
}

int Judge2(char a,char b){
    if((a=='('&&b==')')||(a=='['&&b==']'))
        return 1;
    return 0;
}

int main(){
    SqStack S;
    char a,c,x,y;
    InitStack(S);
    printf("请输入表达式:"); 
    x = getchar();
    while(Judge(x)){
        printf("1");
        if(x=='('||x=='['){
            Push(S,x);
            x=getchar();
        }else{
            if(!Judge2(GetTop(S),x)){
                printf("不合法");
                exit(0);
            }
            Pop(S,c);
            x = getchar();
            }
        }
        
    printf("合法"); 
    
    return 0;    

    }
    

 

转载于:https://www.cnblogs.com/peak01/p/7868502.html

### 括号匹配算法实现 括号匹配是一种经典的计算机科学问题,通常用于验证程序代码或数学表达式中的括号是否正确配对。该问题可以通过栈这一数据结构来高效解决。 #### 使用 C# 的括号匹配算法实现 以下是基于引用的内容以及专业知识构建的一个完整的括号匹配算法实现: ```csharp using System; using System.Collections.Generic; public class BracketMatcher { public static bool IsBalanced(string expression) { Stack<char> stack = new Stack<char>(); foreach (char ch in expression) { if (ch == '(' || ch == '{' || ch == '[') { stack.Push(ch); // 遇到左括号入栈 } else if (ch == ')' || ch == '}' || ch == ']') { if (stack.Count == 0) return false; // 如果栈为空,则说明右括号多余 char top = stack.Pop(); // 出栈并比较 if (!IsMatchingPair(top, ch)) return false; // 不匹配返回false } } return stack.Count == 0; // 所有括号都应匹配完成,最终栈应该为空 } private static bool IsMatchingPair(char openBracket, char closeBracket) { if (openBracket == '(' && closeBracket == ')') return true; if (openBracket == '{' && closeBracket == '}') return true; if (openBracket == '[' && closeBracket == ']') return true; return false; } public static void Main() { string testExpression = "(a + b) * (c - d)"; Console.WriteLine(IsBalanced(testExpression)); // 输出 True string unbalancedTest = "((a + b) * (c - d)"; Console.WriteLine(IsBalanced(unbalancedTest)); // 输出 False } } ``` 上述代码实现了以下逻辑: - 定义了一个 `Stack` 数据结构用来存储左括号[^1]。 - 当遇到左括号时将其压入栈中[^2]。 - 当遇到右括号时检查栈顶元素是否匹配,如果不匹配或者栈为空则返回错误[^3]。 - 表达式遍历完成后如果栈仍非空,则表示存在未匹配的左括号。 #### 关键点解析 1. **栈的作用** 栈的数据结构特性非常适合处理这种“后进先出”的场景。通过将左括号依次存入栈,在遇到右括号时弹出最近的左括号进行匹配,能够有效检测括号是否成对出现。 2. **边界条件** - 输入字符串可能完全不含括号,此时无需进一步操作即可判定为合法。 -括号数量超过左括号的情况会在第一次尝试匹配时不成功即刻终止循环。 3. **复杂度分析** 时间复杂度为 O(n),其中 n 是输入字符串长度。因为每个字符最多只会被访问一次,并且每次操作(如入栈、出栈)都是常数时间的操作[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值