[蓝桥杯2017初赛]正则问题 C++ 栈的思想

题目描述
考虑一种简单的正则表达式:只由 x ( ) | 组成的正则表达式。
小明想求出这个正则表达式能接受的最长字符串的长度。  
例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6
输入格式
输入一个由x()|组成的正则表达式。输入长度不超过100,保证合法。  
输出格式
输出这个正则表达式能接受的最长字符串的长度。  
输入样例
((xx|xxx)x|(x|xx))xx  
输出样例
6

本人补充测试数据 (xxx)x|(xx|(xx|x)x(xx)x)

答案是6

思路
首先,题目保证了数据的合法性,可以省去很多麻烦。本题解选择用c++的栈来解题。

可以用getchar(),循环读入字符到栈s1中。

这个题里面主要有两个要注意的地方:

1. 括号先算;

2. 括号后有x,不能将括号数据输出,因为后面可能还有 '或' 运算符。如(xxx)x|xx

解决办法:

如果碰到右括号,则先算括号里面的数据;然后,存入一个标记到栈s1中,表示括号内数据已被计算,将数字存入栈s2。直到数据读完为止。

取出数据:

循环弹出栈s1的元素,碰到标记则加上标记的数字(弹出栈s2的元素),直到s1为空。

代码环节!

#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;

stack<char> s1;
stack<int> s2;
//(xxx)x|(xx|(xx|x)x(xx)x)
void popFun();
int main(void)
{
	char c;
	int sum=0;
	while((c=getchar()) && c!='\n'){ //读入数据
		if(c!=')')
			s1.push(c);
		else //先算括号
			popFun();
	}
	int tmp=0;
	while(s1.size()){ //取出数据
		if(s1.top()=='x')
			tmp++;
		else if(s1.top()=='t'){
			tmp+=s2.top();
			s2.pop();
		}
		else if(s1.top()=='|'){
			if(tmp>sum)
				sum=tmp;
			tmp=0;
		}
		s1.pop();
	}
	if(tmp>sum)
		sum=tmp;
	cout<<sum;
	
	return 0;
}

void popFun(){
	int maxn=0;
	int tmp=0;
	while(s1.top()!='('){
		if(s1.top()=='x')
			tmp++;
		else if(s1.top()=='|'){ //判断是否比maxn更大
			if(maxn<tmp)
				maxn=tmp;
			tmp=0;
		}
		else if(s1.top()=='t'){ //取出标记的数据
			tmp+=s2.top();
			s2.pop();
		}
		s1.pop();
	}
	if(tmp>maxn) //剩余数据判断
		maxn=tmp;
	s1.pop();//弹出左括号
	s1.push('t');//存入标记
	s2.push(maxn);//存入标记数据
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值