Stack中怎么判断字符串是否合法
发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,这篇文章将为大家详细讲解有关Stack中怎么判断字符串是否合法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。判断字符串是否合法是这样的:有一个字符串,
千家信息网最后更新 2025年02月03日Stack中怎么判断字符串是否合法
这篇文章将为大家详细讲解有关Stack中怎么判断字符串是否合法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
判断字符串是否合法是这样的:有一个字符串,它只包含大中小括号,那么符号 ([)] 这样是不合法的,合法的应该是这样: ([]) ,同样 ([]){ 这样的符号也是不合法的 基于以上的共识,咱们先考虑使用数组的方式,来分析一下。
定义一个初始值,如果刚开始输入的就是 ( 或者 { 或者 [ ,那么我们不能立刻判断到它就是不合法的,因为它需要等待匹配,如果到最后还是没有匹配上,那就是不合法的;如果刚开始输入的是 ) 或者 } 或者 ] ,我们立刻就能知道这是不合法的。
如果此时输入了 ( 和 [ ,初始值应该 ++ ,接下来输入的是右边的符号的话应该是 ] 而不是 ) ,此时需要进行判断第三个输入的字符是否匹配第二个,只有第二个也匹配之后才需要进行匹配第一个字符。
如果匹配成功,则初始值应该 - - ,所有字符串匹配完毕之后,需要看初始值是否为最初赋予的值,如果是则说明所有符号都是合法的,否则说明还有符号没有匹配上,则不合法 经过这样的分析之后,写代码应该就比较好写了,比如我们可以这样实现:
/**
* 判断字符串是否合法
* 比如: "([)]" 不合法, "[()]" 合法
*/
public class IsValidString {
public static void main(String[] args) {
// 定义字符串的内容
String symbol="([]){";
// 调用判断方法
boolean result=isValid(symbol);
System.out.print(result);
}
public static boolean isValid(String s){
// 用来接收传入的值
char[] arr = s.toCharArray();
// 定义一个数组,用来存放传入的字符串,长度为传入的字符串的值
char[] stack = new char[s.length()];
// 定义 stackEnd 为 -1 是为了让第一个元素能够进入数组,即 stackEnd++ 值为 0
int stackEnd=-1,length=s.length();
for(int i=0;i // 如果刚开始是左括号,左中括号等符号,则不能直接判断为该符号不合法,而是放入数组,等待匹配
if(arr[i]=='(' || arr[i]=='[' || arr[i]=='{'){
stackEnd++;
stack[stackEnd]=arr[i];
}
// 如果刚开始就是右括号,右中括号等符号,则不合法,直接返回 false
else if((arr[i]==']' || arr[i]==')' || arr[i]=='}') && stackEnd==-1){
return false;
}
else {
// 分情况来进行匹配
if(arr[i]==')' && stack[stackEnd]=='('){
stackEnd--;
}
else if(arr[i]==']' && stack[stackEnd]=='['){
stackEnd--;
}
else if(arr[i]=='}' && stack[stackEnd]=='{'){
stackEnd--;
}
else{
// 如果都匹配不到,说明该符号不合法,则直接返回 false
return false;
}
}
}
if(stackEnd!=-1){
// 如果最后结果不等于 -1 ,说明 stackEnd 中还有符号没有被匹配到,则也是不合法
return false;
}
else
return true;
}
}
可以明显看到,使用数组的话,会有很多 if , else , else if ,阿粉怎么闻到了坏代码的味道。
有没有更巧妙的方法呢?看下面:
/**
* 判断字符串是否合法
* 比如: "([)]" 不合法, "[()]" 合法
*/
public class IsValidString {
public static void main(String[] args) {
// 定义字符串的内容
String symbol="([]){";
// 调用判断方法
boolean result=isValid(symbol);
System.out.print(result);
}
public static boolean isValid(String s){
// 定义一个空栈
Stack stack=new Stack<>();
// 定义 map ,用来存放匹配的符号
Map map=new HashMap<>();
char[] arr=s.toCharArray();
map.put(')','(');
map.put(']','[');
map.put('}','{');
for (int i=0;i // 如果 map 中不包含进入的符号,说明是左边的符号,直接入栈即可
if (!map.containsKey(arr[i])){
stack.push(arr[i]);
}else {
// 如果进入的符号和栈顶的元素不匹配,则说明符号不合法
if (map.get(arr[i])!=stack.pop()){
return false;
}
}
}
// 最后判断栈是否为空,如果为空,说明所有符号都已匹配完毕,全都合法
// 如果栈不为空,说明还有符号没有匹配到,则不合法
if (stack.empty()){
return true;
}else {
return false;
}
}
}
关于Stack中怎么判断字符串是否合法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
符号
字符
字符串
合法
数组
输入
内容
就是
括号
方法
代码
元素
文章
更多
知识
篇文章
中括号
分析
不错
巧妙
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全越深入人心
如何选中表格一列数据库
热血航线找不到服务器了
ipd软件开发流程说明
企业网络技术开发热线
worklist服务器
安全大脑服务器
学软件开发搞创业搞什么好
数据库技术最有意义的成就是
福州ai服务器
sql数据库约束是什么
深圳市小菜网络技术
内蒙古技能人才实名制数据库
endnote的数据库
lol国外服务器地址
it软件开发试题
网络技术主要就业方向
买电脑做网络安全怎么样
数据库研究难点
游戏软件开发公司流程
小学三年级网络安全主题班会
开封软件开发税务筹划怎么进行
汾阳市委网络安全宣传
数据库创建一个关于销售的表格
当利用ie访问某个远程服务器时
数据库的运维工资
海尔企业网络安全案例
英雄联盟无法连接服务器
lol国外服务器地址
数据库第三级安全标记等级