栈应用 括弧匹配问题 题解(C++)

作者刚刚看到这一题时,觉得需要使用相当高大上的东西——数据结构中的栈高大上个鬼 ,相信各位都对栈不陌生,但作者还是要在提一提:

#include//惊喜不
using namespace std;
int main(){
	stack <int/*指栈的类型*/> s;//构造一个栈
	s.push(a);//输入栈顶元素
	s.size()//返回栈长度
	s.top();//返回栈顶元素
	s.pop();//弹出栈顶元素
}

还有其他的也不经常用了常用作者也不知道了 quq
好了,说完基础,可以做题了,请听题:

括弧匹配检验

时间限制: 1000 ms 内存限制: 65536 KB
提交数: 11603 通过数: 3691

【题目描述】
假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意。

现在的问题是,要求检验一个给定表达式中的括弧是否正确匹配?

输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出 “OK” ,不匹配就输出“Wrong”。

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

【输出】
匹配就输出 “OK” ,不匹配就输出“Wrong”。

【输入样例】
[(])
【输出样例】
Wrong

呵呵呵,这题的确很经典,用栈做二三十行解决,不用栈做大家可以试一试,反正作者没试过。

一样的惯例,先来一段核心伪代码:

if(是前括号/*(或[*/){
	弹入栈;
}else if(小回括号){
	if(长度大于0/*很重要*/且栈顶元素是小前括号){
		弹出栈;
 	}else{
 		cout<<"Wrong";
 		return 0;
 	}
}else{
	if(长度大于0/*很重要*/且栈顶元素是中前括号){
		弹出栈;
	}else{
		cout<<"Wrong";
		return 0;
	}
}
if(长度为0){
	cout<<"OK";
}else{
	cout<<"Wrong";
}

有人可能回不加长度大于0这个条件,我只好送你一句话:Too yuong too simple;

伪代码中的长度大于0非常重要,如果不加的话你可以尝试一下下面这个数据:
input:(()[]
output:Wrong

如果不加输入这个数据,你的代码会崩掉,因为如果第一个字符是回括号的话去弹出栈顶元素,显然没有东西给你弹出,so,呵呵…其他如果不会弹出啊之类的,详见上面的科普。
好了,看一下完整代码对一下你的想法是否跟我一样:

#include
using namespace std;
int main(){
	stack<char> s;
	char k[260];
	cin>>k;
	int len = strlen(k);
	for(int i = 0;i<len;i++){
		char c = k[i];
		if( c == '(' || c == '['){
			s.push(c);
		}else if( c == ')'){
			if(s.top() == '('){
				s.pop();
			}else{
				cout<<"Wrong";
				return 0;
			}
		}else if( c == ']'){
			if(s.top() == '['){
				s.pop();
			}else{
				cout<<"Wrong";
				return 0;
			}
		}
	}
	if(s.size()== 0){
		cout <<"OK";
	}else{
		cout<<"Wrong";
	}
	return 0;
}
//((([[[()[]([[(())]])]]])))一个小小的测试数据,结果是OK

这一题的题解到此为止,呵呵~

你可能感兴趣的:(信息学,题解)