括号匹配问题
- 给定一串字符,不超过100个字符,可能包括括号、数字、字母、标点符号、空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配。
- 输入在一行中给出一行字符串,不超过100个字符,可能包括括号、数字、字母、标点符号、空格。
- 输入样例1:
sin(10+20) - 输出样例1:
yes - 输入样例2:
{[}] - 输出样例2:
no
-
解题思路:(设置一个判断出错的boolean变量记录是否出错,可及时退出循环) -
1.如果面对的是左括号,则全部进栈. -
2.如果面对的不是括号字符(括号以外的字符),则直接跳过. -
- 如果是右括号,则进入以下的步骤
3.1. 如果栈是空的(遇到右括号),说明出错,直接退出 3.2. 如果栈不空 ,且栈顶的元素与当前的括号匹配,则直接抛出栈顶元素 3.3. 3.2的条件不满足,代表出错,则直接退出 -
4.一直做上面的步骤除非上述步骤出错退出,直到遍历完输入的串 -
结果的判断 -
1.如果栈空(表示所有的括号都匹配完)并且记录错误的布尔类型变量没有改变值,表示匹配成功(即完美匹配) -
2.不满足1即非完美匹配 -
正能量 -
加油!每一位放弃华丽而选择包裹光华的人,必将在某天再次展露锋芒! 👍 -
代码实现如下(Java)
import java.util.Scanner;
import java.util.Stack;
public class Main {
private static Stack<Character> st=new Stack<Character>();
private static String shuru;
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
shuru=in.nextLine();
if(is_judge()) System.out.println("yes");
else System.out.println("no");
in.close();
}
private static boolean is_judge(){
boolean is_finish=true; int i;
for(i=0;i<shuru.length();i++){
char ch=shuru.charAt(i);
if(ch=='('||ch=='['||ch=='{') st.push(ch);
else if(ch==')'||ch==']'||ch=='}'){
if(st.isEmpty()) is_finish=false;
else if(ch==')'&&!st.isEmpty()){
if(st.peek()=='(') st.pop();
else is_finish=false;
}
else if(ch==']'&&!st.isEmpty()){
if(st.peek()=='[') st.pop();
else is_finish=false;
}
else if(ch=='}'&&!st.isEmpty()){
if(st.peek()=='{') st.pop();
else is_finish=false;
}
}
if(!is_finish) break;
}
if(is_finish&&st.isEmpty()) return true;
return false;
}
}
#include<bits/stdc++.h>
using namespace std;
stack<char> st;
bool f=true;
int main(){
string s;
getline(cin,s);
for(int i=0;i<s.size();i++){
if(s[i]=='('||s[i]=='['||s[i]=='{'){
st.push(s[i]);
}
else if(s[i]==')'||s[i]==']'||s[i]=='}'){
if(st.empty()) f=false;
else if(s[i]==')'&&!st.empty())
{
if(st.top()=='(')
st.pop();
else
f=false;
}
else if(s[i]==']'&&!st.empty())
{
if(st.top()=='[')
st.pop();
else
f=false;
}
else if(s[i]=='}'&&!st.empty())
{
if(st.top()=='{')
st.pop();
else
f=false;
}
}
}
if(f&&st.empty()) cout<<"yes";
else
cout<<"no";
return 0;
}
|