C语言中利用栈检测括号是否匹配

检测括号是否匹配的算法中,栈的特性是最符合括号特点的。栈的先进后出将括号的匹配正好完美实现。

思想:

从字符串开头向后逐个检测,检测到除括号外的元素就跳过。检测到左括号时,就进行入栈操作,继续向后检测。检测到有括号时,就检查栈顶元素是否是匹配的左括号。若不匹配,则直接返回错误信号,使程序结束;若匹配,进行出栈操作,继续向后检测。结束时,要判断栈是否为空,若不为空,则括号不匹配;若为空,则括号匹配。

代码:

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

#define	 STA_SIZE	50	//栈的大小
#define	 BUF_SIZE	50	//输入字符串的大小

//栈的声明
struct stack{
	char sta[STA_SIZE];
	int top;
};
//判断栈是否为空
int if_empty(struct stack* psta)
{
	if(psta->top == -1)
		return 0;
	else
		return 1;
}
判断栈是否为满
int if_full(struct stack* psta)
{
	if(psta->top == STA_SIZE - 1)
		return 1;
	else 
		return 0;
}
//初始化栈
void init_stack(struct stack* psta)
{
	psta->top = -1;
	bzero(psta->sta, sizeof(char)*STA_SIZE);
}
//入栈操作
int push_stack(struct stack* psta, char data)
{
	if(if_full(psta)){
		printf("stack is full. \n");
		exit(1);
	}
	(psta->top)++;
	psta->sta[psta->top] = data;
}
//出栈操作
char pop_stack(struct stack* psta)
{
	if(if_empty(psta) == 0){
		printf("stack is empty. \n");
		exit(1);
	}
	char tmp = psta->sta[psta->top];
	(psta->top)--;
	
	return tmp;
}
//查看栈顶元素
char get_top_data(struct stack* psta)
{
	if(if_empty(psta) == 0){
		return -1;
	}
	char tmp = psta->sta[psta->top];

	return tmp;
}
//括号匹配函数
int bracket_match(struct stack* sta, char* string)
{
	char* ps = string;
	while(*ps != '\0'){
		switch (*ps) {
			case '(':
			case '{':
			case '[':
			case '<': 
				push_stack(sta, *ps);		
				break;
			case ')':
				if ('(' == (get_top_data(sta)))	{	
					pop_stack(sta);
					break;
				} else 
					goto err; 
			case '}':
				if ('{' == (get_top_data(sta)))	{
					pop_stack(sta);
					break;
				} else 
					goto err; 
			case ']':
				if ('[' == (get_top_data(sta)))	{
					pop_stack(sta);
					break;
				} else 
					goto err; 
			case '>':
				if ('<' == (get_top_data(sta)))	{
					pop_stack(sta);
					break;
				} else 
					goto err; 
			default:
				 break;
		}
		ps++;
	}	
	if(if_empty(sta) == 0)
ok:
		return 0;
	else 
err:
		return 1;
}
int main(int argc, char* argv[])
{
	struct stack sta;

	init_stack(&sta);	

	char buf[BUF_SIZE] = {0};	

//	char* buf = "he({ljfs})jfkdjs";
	printf("请输入要检测的不超过50个字符的字符串:\n");
	fgets(buf, BUF_SIZE, stdin);

	int ret = bracket_match(&sta, buf);	
	if(ret == 0)
		printf("括号检测匹配... \n");
	else
		printf("括号检测不匹配... \n");
		
	return 0;
}

结果:


  • 17
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值