利用栈实现括号匹配问题

1.原理步骤

  • 从头开始扫描字符串,如果是左括号,入栈
  • 如果是右括号,检查栈是否为空,如果为空,说明没有左括号与当前的右括号相匹配。如果栈不为空且栈顶元素与当前符号相匹配,继续检查下一元素
  • 重复以上过程,直至扫描完最后一个元素
  • 检查栈是否为空,如果不为空,说明栈中还存有左括号没有与之对应的右括号相匹配。如果为空,说明匹配成功

2.代码实现

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define MaxSize 50
typedef struct {
	char data[MaxSize];
	int top;
}SqStack;

void initStack(SqStack& S) {
	S.top = -1;
}

bool pushStack(SqStack& S, char& x) {
	if (S.top > MaxSize - 1) {
		return false;
	}
	S.top++;
	S.data[S.top] = x;
	return true;
}

bool popStack(SqStack& S,char &x){
	if (S.top == -1) {
		return false;
	}
	x = S.data[S.top];
	S.top--;
	return true;
}

bool isEmpty(SqStack& S) {
	if (S.top == -1) {
		return true;
	}
	return false;
}

char getTopEle(SqStack S) {
	return S.data[S.top];
}

//括号匹配函数
bool parenMatch(char pa[],int length) {
	SqStack S;
	initStack(S);
	for (int i = 0; i < length; i++) {
		if (!pa[i])
			break;
		if (pa[i] == '(' || pa[i] == '[' || pa[i] == '{') {   //如果是左括号全部入栈
			pushStack(S, pa[i]);
		}
		else {
			
			if (isEmpty(S)) {     //如果是右括号,但是栈中没有符号,return false  
				return false;
			}
			if ( pa[i] == ')' && getTopEle(S) == '(') {
				popStack(S, S.data[S.top]);
			}
			if (pa[i] == ']' &&getTopEle(S) == '[') {
				popStack(S, S.data[S.top]);
			}
			if (pa[i] == '}' && getTopEle(S) == '{') {
				popStack(S, S.data[S.top]);
			}
			
		}
	}
	return isEmpty(S);    //全部匹配成功后,如果栈中含有符号,则说明输入的符号不能成对匹配
}
int main() {
	char pa[50];
	printf("输入你想要匹配的符号(不能超过50),如{ [ ( ) } ]:");
	scanf("%s", &pa);
	int length = sizeof(pa) / sizeof(char);
	bool res=parenMatch(pa, length);
	if (res) {
		printf("匹配成功!");
	}
	else {
		printf("匹配失败!");
	}
}

3.测试

成功:

失败:

  • 8
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值