目录

  • 匹配括号
  • 一匹配括号问题
  • 二.求解思路
  • 三.代码(python)
  • 四.代码(C++)
  • 五.代码(Java)


匹配括号

一匹配括号问题

括号匹配问题是符号匹配中一种特例,括号匹配就是对输入的一组括号进行左右对应,当每个左括号都可以与有括号进行对应时,我们就输出True,否则输出False。可以看下面的示例:

>>> (([})
False
>>> ([{}])
True

二.求解思路

1)因为我们需要一个容器来存放这些符号,然后让它们进行匹配,然后它必须遵循前面的括号先放进但是它最后进行匹配,所以可以使用Stack(栈)来存放括号。
2)我们可以利用栈遇到左括号先放进来,当遇到右括号时弹出离他最近的左括号(即栈顶括号)并匹配,若符合则继续进行,若不符合则输出False。

三.代码(python)

from pythonds.basic import Stack #引入栈

def parChecked(symbolString):
    
    s = Stack()  #生成一个空栈
    index = 0
    balanced = True
    
    while index<len(symbolString) and balanced: #跳出条件,当符号全输入或者匹配失败时
        symbol = symbolString[index]  #取出要输入的符号
        if symbol in '([{':   #如果时左括号则压栈
            s.push(symbol)
        else:
            if s.isEmpty():   #如果是右括号则判断栈中是否有左括号,如果没有左括号则直接匹配失败
                balanced = False
            else:     #如果有左括号则进行匹配
                top = s.pop()
                if not matches(top,symbol):
                    balanced = False
        index = index+1     #输入一个则下标加一

    if balanced and s.isEmpty(): #循环完毕后判断是否匹配并输出  
        return True
    else:
        return False
    
def matches(open1,close1):  #匹配函数,判读左右括号是否相匹配
    opens = '([{'
    closers = ')]}'
    return opens.index(open1) == closers.index(close1)

输出显示

python 匹配中括号后的内容 python括号匹配算法_Stack

四.代码(C++)

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

bool parChecked(string symbolString)  //判断函数
{
    stack<char>s;
    int index = 0;

    while(index<symbolString.size())  
    {
        char symbol = symbolString[index];

        if(symbol == '(' || symbol == '[' || symbol == '{') s.push(symbol);  //若为左括号直接加入

        else if(s.size()==0) return false;   //遇到右括号时栈里没有左括号直接返回false
        
        else
        {
            char top = s.top();  //返回栈顶符号

            s.pop();   //弹出栈顶符号
            
            //如果匹配则什么都不用做
            if((top == '(' && symbol == ')') || (top == '[' && symbol == ']') || (top == '{' && symbol == '}')) {}
            
            //如果不符合直接返回false
            else return false;
        }
        index +=1;
    }
    //如果循环完还没结束函数,那么该字符串符合匹配,返回True
    return true;
}

void print(string s) //返回结果函数
{
    if(parChecked(s)) cout<<s<<" : True\n";
    else cout<<s<<" : False\n";
}
int main()
{
    string s1 = "({})";
    string s2 = "([[})";
    print(s1);
    print(s2);
    system("pause");
    return 0;

}

输出

python 匹配中括号后的内容 python括号匹配算法_python 匹配中括号后的内容_02

五.代码(Java)

package test;

import java.util.Stack;

public class Test {
	public static boolean parChecked(String symbolString) 
	{
		Stack<Character>s = new Stack<Character>();
	    int index = 0;

	    while(index<symbolString.length())  
	    {
	        char symbol = symbolString.charAt(index); //取出每个位置的符号

	        if(symbol == '(' || symbol == '[' || symbol == '{') s.push(symbol);  //若为左括号直接加入

	        else if(s.size()==0) return false;   //遇到右括号时栈里没有左括号直接返回false
	        
	        else
	        {
	            char top = s.peek();  //返回栈顶符号

	            s.pop();   //弹出栈顶符号
	            
	            //如果匹配则什么都不用做
	            if((top == '(' && symbol == ')') || (top == '[' && symbol == ']') || (top == '{' && symbol == '}')) {}
	            
	            //如果不符合直接返回false
	            else return false;
	        }
	        index +=1;
	    }
	    //如果循环完还没结束函数,那么该字符串符合匹配,返回True
	    return true;
	}
	public static void print(String s) //返回结果函数
	{
	    if(parChecked(s)) System.out.println(s+" : True");
	    else System.out.println(s+" : True");
	}
	public static void mian(String [] args)  //主函数
	{
		String s1 = "({})";
	    String s2 = "([[})";
	    print(s1);
	    print(s2);
	}
}