栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

利用栈解决()[]的对应问题,基于水题——括号序列

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

利用栈解决()[]的对应问题,基于水题——括号序列

1、题目

定义如下规则序列(字符串):

1.空序列是规则序列;

2.如果S是规则序列,那么(S)和[S]也是规则序列;

3.如果A和B都是规则序列,那么AB也是规则序列。

例如,下面的字符串都是规则序列:

(),[],(()),([]),()[],()[()]

而以下几个则不是:

(,[,],)(,()),([()

现在,给你一些由‘(’,‘)’,‘[’,‘]’构成的序列,你要做的,是补全该括号序列,即扫描一遍原序列,对每一个右括号,找到在它左边最靠近它的左括号匹配,如果没有就放弃。在以这种方式把原序列匹配完成后,把剩下的未匹配的括号补全。

输入:

([()

输出:

()[]()
 2、题解
int main() {
	//()[()))(];算法思路,利用栈,默认规则即为0,如果不规则,再利用数组打上标记,且只要标记左符号就好,然后输出的时候再特殊输出就好,(((()())()[((())]
	string str;
	cin >> str;
	
	int* state = new int[str.size()]();//初始为0,默认规则,[(]
	stack arr;	
	
	for (int i = str.size() - 1; i >= 0; i--) {
		
		if (arr.empty()) {//初始化,栈为空时
			if (str[i] == ')' || str[i] == ']') {
				arr.push(str[i]);
			}
			else {
				state[i] = 1;
			
			}
		}
		else {//初始化,栈不为空,分为四种情况讨论
			if (str[i] == ')' || str[i] == ']')arr.push(str[i] + 'i');
			else if (str[i] == '(') {
				if (arr.top() == ')')arr.pop();
				else { 
					state[i] = 1; 
				}//不规则
				
			}
			else {
				if (arr.top() == ']')arr.pop();
				else { state[i] = 1;
				}
			}

		}
	}
	
		//栈空,解决了([不匹配的情况
		stringstream ss;
	for (int i = 0; i < str.size(); ++i) {
		if (state[i] == 0)cout << str[i];
		else {
			if (str[i] == '(')cout << "()";
			else cout << "[]";
		}
	}
	delete []state;
	cout << endl;
	//栈非空,即有)]的剩余,两种方式,一种再走一遍,解决有多余;一种将入栈的数据打上标签
	string right;
	ss >> right;
	cout << right;
	stack sta;
	state = new int[right.size()]();
	for (int i = 0; i  

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/605353.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号