括号匹配问题

文章描述了一个C语言程序,通过栈的数据结构实现对输入括号序列的匹配检查,判断括号是否能刚好左右配对。

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

一、题目

给一组括号数组例如"((([{}])))",写程序判断它们是否能刚好左右括号相匹配,并返回TRUE or FALSE

二、解答

用栈来匹配括号,

  • 如果是左括号就入栈,
  • 如果是右括号,
    • 先判断栈是否为空
      • 若为空则肯定不能刚好匹配;
      • 若不为空 则判断是否与栈顶括号恰好匹配,
        • 匹配失败直接返回False
        • 匹配成功 则弹出栈顶元素后进行下一轮循环
#include<stdio.h>

#define MAX_SIZE 10
typedef struct {
	char data[MAX_SIZE];
	int top; //栈顶元素是指向下一个(更上层)空位的 
	
	/**
		       _________________
             top->|________________|
	                _________________
	               |___data[Max]____| 
	               _________________
	               |________________|
	           		   ...
	               _________________
		       |_____data[0]____|
	*/ 
}SqStack;

/** 
	C语言不可以在结构体中初始化变量
	所以需要定义一个init函数 用来初始化各种变量
	否则成员的值都是未初始化的 会出现错误。
*/  
void initStack(SqStack *s){
	s->top = 0;
}

/**
	输出栈的全部元素 
*/
void printStack(SqStack s){
	int i;
	
	for(i = s.top-1 ; i >= 0 ; i--){
		printf("%c \n",s.data[i]);
	}
}


/**
	栈空返回1
	否则返回0 
*/
int stackEmpty(SqStack s){
	if(s.top <= 0) return 1;
	return 0;
}

/**
	栈满返回1
	否则返回0 
*/
int stackFull(SqStack s){
	if(s.top >= MAX_SIZE) return 1;
	return 0; 
}


/**
	入栈
	*注意c语言是不支持true&false ,需要用1/0表示t/f 
*/ 
int push(SqStack *s,char e){
	if(stackFull(*s)) return 0;
	s->data[s->top++] = e;
	return 1;
}

/**
	出栈 
*/
int pop(SqStack *s , char *e){
	if(stackEmpty(*s)) return 0;
	*e = s->data[--s->top];
	return 1;	
}



int bracketCheck(char bracket[],int length){
	SqStack s;
	initStack(&s);
	
	int i;
	for(i = 0 ; i < length ; i++){
//		printf("第%d次\n",i);
//		printStack(s);
//		printf("-----------\n");
		
		if(bracket[i] == '(' || bracket[i] == '[' || bracket[i] == '{'){
			push(&s,bracket[i]);
			continue;
		}
		
		//如果是右括号 
		// 首先判断栈为空 如果栈为空直接返回0
		//	栈不为空 再判断是否与相应的左括号匹配 不匹配返回0 
		if(stackEmpty(s)) return 0;
		char e; 
		e = pop(&s,&e);
		
		if(bracket[i] == '(' && e != ')') return 0;
		if(bracket[i] == '[' && e != ']') return 0;
		if(bracket[i] == '{' && e != '}') return 0;
		
	}
	
//	printf("loop finished!");
	if(!stackEmpty(s)) return 0; //栈不为空即 还有残余的左括号未匹配  错误
	return 1; 
} 

int main(){
char brackets[][MAX_SIZE] = {
        "((()))",
        "(()(()",
        "abcdefg",
        "{[()]}",
        "({}abc)",
        "",
        "((",
        "))",
        "{{}}()[]"
    };
    
    int numTests = sizeof(brackets) / sizeof(brackets[0]); //9 
    /**
    这里要特殊说明 为什么brackets数组中的每个字符串长度都不相同 但是得到的numTests确实正确的9
	因为会自动补齐至最长长度的字符串
	    char c[3][8]={"apple","orange","banana"};
		以上初始化语句中,二维数组的第一维大小均可省略。数组 c 的逻辑结构如下所示:
				0	1	2	3	4	5	6	7
		c[0]	a	p	p	l	e	\0	\0	\0
		c[1]	o	r	a	n	g	e	\0	\0
		c[2]	b	a	n	a	n	a	\0	\0
 
    */


    printf("Total Test Nums : %d \n",numTests);
    
    int i;
    for (i = 0; i < numTests; i++) {
        int length = strlen(brackets[i]);
        int result = bracketCheck(brackets[i], length);
        printf("Test %d: %s - Result: %d\n", i + 1, brackets[i], result);
    }

/**
	Total Test Nums : 9
	Test 1: ((())) - Result: 1
	Test 2: (()(() - Result: 0
	Test 3: abcdefg - Result: 0
	Test 4: {[()]} - Result: 1
	Test 5: ({}abc) - Result: 0
	Test 6:  - Result: 1
	Test 7: (( - Result: 0
	Test 8: )) - Result: 0
	Test 9: {{}}()[] - Result: 1

*/

    return 0;
}



/**
**测试过程
 
int main(){
	SqStack s;
	initStack(&s);
	
	int i;
	for(i = 1 ; i <= MAX_SIZE +2 ; i++){
		if(!stackFull(s)) push(&s,'(');
		else printf("%d %d,FULL!!\n",i,s.top);
	}
	printStack(s);
	
	while(!stackEmpty(s)){
		//这里只需要定义一个普通变量e,然后将e的地址传入函数
		//函数中定义指针e 那么就可以将函数中e的值带回。 
		char e;
		pop(&s,&e);
		printf("%c ",e);
	}
	
	printf("\n"); 
	printStack(s);	
	

}
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值