括号配对检查

本文介绍了一种使用栈数据结构来解决括号匹配问题的方法。通过遍历输入字符串中的每个字符,利用栈来记录未匹配的左括号,并检查是否能与后续的右括号正确配对。

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

利用栈来解决括号配对问题,左括号配右括号, 如:  (  )  配对正确    (  ]   配对错误           (  [  ]  ) 配对正确     (   [  )   ) 配对错误

代码简单,注释可以看懂

 

#include<stdio.h>
#include<malloc.h>
#define STACK_INIT_SIZE	 100
#define STACKINCREMENT 10
typedef struct 
{
	char *base;
	char *top;
	int stacksize;
} SqStack;

int main()
{
	//各函数集的声明 
	bool Push(SqStack &s , char e);
	bool Pop(SqStack &s , char &e);
	bool GetTop(SqStack s , char &e);
	bool InitStack(SqStack &s);
	bool  panDuan(char kuoHao[] , SqStack &s);
	
	
	char kuoHao[8]={'[' , '(' , '[' , '(' ,'[' , ']' , ')' , '('};
	SqStack s;
	InitStack(s);
	if( panDuan(kuoHao , s)) printf("括号配对正确");
	else  printf("括号配对错误");
}

bool Push(SqStack &s , char e)
{
	if(s.top - s.base >= s.stacksize ) //栈满
	{
		s.base = (char*)realloc(s.base , (s.stacksize+STACKINCREMENT ) *sizeof(char) )	;
		if(!s.base)  return false;
		s.top =  s.base + s.stacksize;
		s.stacksize += STACKINCREMENT;
	} 
	*s.top++ = e;
	return true;
}

bool Pop(SqStack &s , char &e) //出栈 
{
	if(s.top == s.base) return false;
	e = * --s.top;
	return true;
}

bool GetTop(SqStack s , char &e)  //取栈顶元素 
{
	if(s.top == s.base ) return false;
	e = *(s.top-1);
	return true;
}

bool InitStack(SqStack &s)  
{
	s.base = (char*)malloc(STACK_INIT_SIZE * sizeof(char));
	if(!s.base)   return false;
	s.top = s.base;
	s.stacksize = STACK_INIT_SIZE;
	return true;
}

bool  panDuan(char kuoHao[] , SqStack &s)
{
	char stack_top_value;
	char u ;//临时存放Pop出来的栈顶值 
	for(int i=0 ; i<8 ; i++)
	{
		char m = kuoHao[i];
		if(m == '(' || m == '[')
		{
			Push(s , m);
		}
		
		if(m == ')')
		{
			GetTop(s , stack_top_value);
			if(stack_top_value == '(')
			Pop(s , u );  
		}
		else
		{
		
			if(m == ']')
			{
				GetTop(s , stack_top_value);
				if(stack_top_value == '[')
				Pop(s , u );
			}
			else
			{
				return false;  //括号配对错误 
			}
		}
	}
	
	return true; // 括号配对正确 
}

运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值