栈应用--括号匹配

发布时间 2023-03-26 22:30:21作者: 破忒头头

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 50
typedef char ElemType;

typedef struct{
	ElemType data[MaxSize];
	int top;
}SqStack;

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

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

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

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

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

char * s_gets(char * st, int n){
	char * ret_val;
	int i = 0;
	ret_val = fgets(st, n, stdin);
	if(ret_val){
		while (st[i] != '\n' && st[i] != '\0')
			i++;
		if(st[i] == '\n'){
			st[i] = '\0';
		}else{
			while(getchar() != '\n')
				continue;
		}
	}
	return ret_val;
}
SqStack S;

bool Match(char * input){
	ElemType data;
	while(*input != '\0'){
		switch (*input){
			case '(':
				Push(S,*input);
				break;
			case '[':
				Push(S,*input);
				break;
			case '{':
				Push(S,*input);
				break;
			case ')':
				Pop(S,data);
				if(data != '('){
					return false;
				}
				break;
			case '}':
				Pop(S,data);
				if(data != '{'){
					return false;
				}
				break;
			case ']':
				Pop(S,data);
				if(data != '['){
					return false;
				}
				break;
		}
		input++;
	}
	if(StackEmpty(S)) return true;
	else return false;
}


int main(){
	InitStack(S);
	char input[50];
	s_gets(input,50);
	printf("%s",input);
	bool ret_val = Match(input);
	if(ret_val) printf("Yes");
	else printf("No");
	
	return 0;
}