(栈)括号匹配问题

括号匹配问题

  • 问题描述
  • 给定一串字符,不超过100个字符,可能包括括号、数字、字母、标点符号、空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配。
  • 输入格式
  • 输入在一行中给出一行字符串,不超过100个字符,可能包括括号、数字、字母、标点符号、空格。
  • 输出格式
  • 如果括号配对,输出yes,否则输出no。
  • 样例
  • 输入样例1:
    sin(10+20)
  • 输出样例1:
    yes
  • 输入样例2:
    {[}]
  • 输出样例2:
    no
  • 解题思路:(设置一个判断出错的boolean变量记录是否出错,可及时退出循环)
  • 1.如果面对的是左括号,则全部进栈.

  • 2.如果面对的不是括号字符(括号以外的字符),则直接跳过.

    1. 如果是右括号,则进入以下的步骤
      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;
    }
}
  • 代码实现如下(C++)
#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;
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SweetCode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值