這篇文章將為大家詳細講解有關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<length;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<Character> stack=new Stack<>();
// 定義 map ,用來存放匹配的符號
Map<Character,Character> map=new HashMap<>();
char[] arr=s.toCharArray();
map.put(')','(');
map.put(']','[');
map.put('}','{');
for (int i=0;i<arr.length;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中怎么判斷字符串是否合法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。