0
点赞
收藏
分享

微信扫一扫

利用栈实现括号匹配问题

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.测试

成功:

失败:

 

 

举报

相关推荐

0 条评论