目录
- 匹配括号
- 一匹配括号问题
- 二.求解思路
- 三.代码(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)
输出显示
四.代码(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;
}
输出
五.代码(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);
}
}