jzxx1542 括弧匹配检验

版权声明:本文为博主原创文章,未经博主允许不得转载,不得用于商业用途。 https://blog.csdn.net/WDAJSNHC/article/details/79945660

jzxx1542  括弧匹配检验

时空限制    1000ms/64MB

题目描述

假设表达式中允许包含三种括号:圆括号,方括号和花括号,其嵌套的顺序随意,如{[ ]()}或[([ ][ ])]等为正确的匹配,[(])或([ ]( )或 (()))均为错误的匹配。现在的问题是,要求检验一个给定表达式中的括弧是否正确匹配?输入一个包含圆括号,方括号,花括号和其它字符的字符串,判断字符串中的括号是否匹配,匹配就输出 “T” ,不匹配就输出“F”。

输入

输入仅一行字符(字符个数小于255)

输出

匹配就输出 “T” ,不匹配就输出“F”。

样例输入 

示例1:38+38+[8+(5-2])
示例2:19-[8/(3+[5-2]*[7-5])]

样例输出 

示例1:F      示例2:T

 

代码

法一:STL栈

#include<iostream>
#include<string>
#include<stack>
using namespace std;
const char f[] = {'(','[','{',')',']','}'};	//左部分和右部分间隔3
string s;
stack<int> sk;
int a[300];

int main(){
	getline(cin,s);
	int len=s.size(),cnt=0;
	for (int i=0; i<len; i++)
		for (int j=0; j<6; j++)
			if (s[i]==f[j]) { a[cnt++]=j; break; }	//筛选出括号,建立映射
	for (int i=0; i<cnt; i++)
		if (a[i]<=2) sk.push(a[i]);	//左边部分,入栈
		else {	//右边部分
			if (sk.empty()) { cout<<"F\n"; return 0; }
			else if (sk.top()+3==a[i]) sk.pop(); //匹配 退栈
			else sk.push(a[i]);
		}
	if (sk.empty()) cout<<"T\n";
	else cout<<"F\n";
	return 0;
}

法二:手动栈

#include<iostream>
#include<string>
using namespace std;
const int N = 300;
const char f[] = {'(','[','{',')',']','}'};	//左部分和右部分间隔3
string s;
int a[300],stack[300];

int main(){
	getline(cin,s);
	int len=s.size(),cnt=0,top=0;
	for (int i=0; i<len; i++)
		for (int j=0; j<6; j++)
			if (s[i]==f[j]) { a[cnt++]=j; break; }	//筛选出括号,建立映射
	for (int i=0; i<cnt; i++)
		if (a[i]<=2) stack[++top]=a[i];	//左边部分,入栈
		else {	//右边部分
			if (!top) { cout<<"F\n"; return 0; }
			else if (stack[top]+3==a[i]) top--; //匹配 退栈
			else stack[++top]=a[i];
		}
	if (!top) cout<<"T\n";
	else cout<<"F\n";
	return 0;
}
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页