Stack中怎么判断字符串是否合法
发表于:2024-11-11 作者:千家信息网编辑
千家信息网最后更新 2024年11月11日,这篇文章将为大家详细讲解有关Stack中怎么判断字符串是否合法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。判断字符串是否合法是这样的:有一个字符串,
千家信息网最后更新 2024年11月11日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安全错误
数据库的锁怎样保障安全
服务器brd灯亮重启
单抗数据库
软件开发人才流失的原因
江西软件开发学院排名
深圳专业软件开发回收价
象山狼仝网络技术有限公司
崇明区会计网络技术欢迎咨询
乐山哪里有做软件开发的
德训云服务器
中国网络安全能力咋样
憨猴科技与互联网
数据库的状态包括什么意思
智能互联网络技术职业规划
wincc 变量加服务器前缀
广东省网络安全等级保护专家
dota物品数据库无用挂件
期刊论文的数据库权利
网络安全专业律师
公司网络安全目标责任书
ios本地服务器
建材营销软件开发
观星天合网络技术有限公司
中职计算机网络技术面试
qq 好友数据库
互联网网络安全保护
三明市智慧医疗云平台软件开发
计算机网络技术应用高中
服务器安全性是指什么区别
语音服务器连接被断开
浙江网络技术服务方案