栈的应用:括号配对

括号配对是栈当中的一道经典题,我遇到过的次数估计也有一手之数了。趁着考研复习数据结构又来了一遍。

括号配对通常是值[] ()、{}、[(){}]、[({})]类似这样的是合法的,而[][、[])、[(])这样的是非法的。解决的思路也就是从左往右按顺序入栈,只需要左括号入栈,如果遇到又括号则与栈顶括号匹配,不匹配或者栈顶为空则这一个括号的组合序列就不是匹配的。

栈、可以用数组模拟一个栈,也可用C++ STL中封装好的,还可以自己定义栈。因为考试和面试中喜欢让自己实现栈,所以我按照前面所学,建立一个顺序栈来解决此问题。

code:

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

#define MaxSize 100

typedef struct{
	char data[MaxSize];
	int top; // 栈顶指针 
}SqStack;

// 初始化 
void StackInit(SqStack &S)
{
	S.top = 0;
}
// 入栈 
bool StackPush(SqStack &S, char e)
{
	if(S.top == MaxSize){
		return false;
	}
	S.data[S.top++] = e;
//	printf("S.data[S.top-1] = %c\n", S.data[S.top-1]);
	return true;
}
// 出栈 
bool StackPop(SqStack &S)
{
	if(S.top == 0){
		return false;
	}
	S.top--;
	return true;
}
// 获取栈顶元素
char GetTop(SqStack S) 
{
	if(S.top == 0){
		exit(1);
	} 
	return S.data[S.top-1];
}
// 判空 
bool StackIsEmpty(SqStack S)
{
	return (S.top == 0 ? true : false); 
}
// 检查括号是否配对 
bool check(SqStack S, char e)
{
	char stop = GetTop(S); // 获取栈顶元素 
	bool flag = false;
	// 三种配对情况 
	if(stop == '[' && e == ']'){
		flag = true;
	}
	else if(stop == '(' && e == ')'){
		flag = true;
	}
	else if(stop == '{' && e == '}'){
		flag = true;
	}
	return flag;
}

int main() 
{
	SqStack S;
	StackInit(S);
	char str[MaxSize];
	scanf("%s", str);
	printf("str = %s\n", str);
	int len = strlen(str);
	for(int i = 0; i < len; i++){
//		printf("str[%d] = %c\n", i, str[i]);
		if(StackIsEmpty(S)){ // 栈为空直接入栈 
			StackPush(S, str[i]);
			
		}
		else if(check(S, str[i])){ // 当前元素与栈顶元素相同出栈 
			StackPop(S);
			
		}
		else{
			StackPush(S, str[i]); // 不同入栈 
		}
	} 
	if(StackIsEmpty(S)){
		printf("Yes\n");
	}
	else{
		printf("No\n");
	}
	
	return 0;
}

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值