這篇文章將為大家詳細(xì)講解有關(guān)Stack中怎么判斷字符串是否合法,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站制作、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的旬陽網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
判斷字符串是否合法是這樣的:有一個(gè)字符串,它只包含大中小括號,那么符號 ([)] 這樣是不合法的,合法的應(yīng)該是這樣: ([]) ,同樣 ([]){ 這樣的符號也是不合法的 基于以上的共識,咱們先考慮使用數(shù)組的方式,來分析一下。
定義一個(gè)初始值,如果剛開始輸入的就是 ( 或者 { 或者 [ ,那么我們不能立刻判斷到它就是不合法的,因?yàn)樗枰却ヅ?,如果到最后還是沒有匹配上,那就是不合法的;如果剛開始輸入的是 ) 或者 } 或者 ] ,我們立刻就能知道這是不合法的。
如果此時(shí)輸入了 ( 和 [ ,初始值應(yīng)該 ++ ,接下來輸入的是右邊的符號的話應(yīng)該是 ] 而不是 ) ,此時(shí)需要進(jìn)行判斷第三個(gè)輸入的字符是否匹配第二個(gè),只有第二個(gè)也匹配之后才需要進(jìn)行匹配第一個(gè)字符。
如果匹配成功,則初始值應(yīng)該 - - ,所有字符串匹配完畢之后,需要看初始值是否為最初賦予的值,如果是則說明所有符號都是合法的,否則說明還有符號沒有匹配上,則不合法 經(jīng)過這樣的分析之后,寫代碼應(yīng)該就比較好寫了,比如我們可以這樣實(shí)現(xiàn):
/**
* 判斷字符串是否合法
* 比如: "([)]" 不合法, "[()]" 合法
*/
public class IsValidString {
public static void main(String[] args) {
// 定義字符串的內(nèi)容
String symbol="([]){";
// 調(diào)用判斷方法
boolean result=isValid(symbol);
System.out.print(result);
}
public static boolean isValid(String s){
// 用來接收傳入的值
char[] arr = s.toCharArray();
// 定義一個(gè)數(shù)組,用來存放傳入的字符串,長度為傳入的字符串的值
char[] stack = new char[s.length()];
// 定義 stackEnd 為 -1 是為了讓第一個(gè)元素能夠進(jìn)入數(shù)組,即 stackEnd++ 值為 0
int stackEnd=-1,length=s.length();
for(int i=0;i // 如果剛開始是左括號,左中括號等符號,則不能直接判斷為該符號不合法,而是放入數(shù)組,等待匹配
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 {
// 分情況來進(jìn)行匹配
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){
// 如果最后結(jié)果不等于 -1 ,說明 stackEnd 中還有符號沒有被匹配到,則也是不合法
return false;
}
else
return true;
}
}
可以明顯看到,使用數(shù)組的話,會(huì)有很多 if , else , else if ,阿粉怎么聞到了壞代碼的味道。
有沒有更巧妙的方法呢?看下面:
/**
* 判斷字符串是否合法
* 比如: "([)]" 不合法, "[()]" 合法
*/
public class IsValidString {
public static void main(String[] args) {
// 定義字符串的內(nèi)容
String symbol="([]){";
// 調(diào)用判斷方法
boolean result=isValid(symbol);
System.out.print(result);
}
public static boolean isValid(String s){
// 定義一個(gè)空棧
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 中不包含進(jìn)入的符號,說明是左邊的符號,直接入棧即可
if (!map.containsKey(arr[i])){
stack.push(arr[i]);
}else {
// 如果進(jìn)入的符號和棧頂?shù)脑夭黄ヅ?則說明符號不合法
if (map.get(arr[i])!=stack.pop()){
return false;
}
}
}
// 最后判斷棧是否為空,如果為空,說明所有符號都已匹配完畢,全都合法
// 如果棧不為空,說明還有符號沒有匹配到,則不合法
if (stack.empty()){
return true;
}else {
return false;
}
}
}
關(guān)于Stack中怎么判斷字符串是否合法就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。