溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Stack中怎么判斷字符串是否合法

發布時間:2021-08-02 11:41:58 來源:億速云 閱讀:187 作者:Leah 欄目:大數據

這篇文章將為大家詳細講解有關Stack中怎么判斷字符串是否合法,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。


判斷字符串是否合法是這樣的:有一個字符串,它只包含大中小括號,那么符號 ([)] 這樣是不合法的,合法的應該是這樣: ([]) ,同樣 ([]){ 這樣的符號也是不合法的 基于以上的共識,咱們先考慮使用數組的方式,來分析一下。

  1. 定義一個初始值,如果剛開始輸入的就是 ( 或者 { 或者 [ ,那么我們不能立刻判斷到它就是不合法的,因為它需要等待匹配,如果到最后還是沒有匹配上,那就是不合法的;如果剛開始輸入的是 ) 或者 } 或者 ] ,我們立刻就能知道這是不合法的。

  2. 如果此時輸入了 ( 和 [ ,初始值應該 ++ ,接下來輸入的是右邊的符號的話應該是 ] 而不是 ) ,此時需要進行判斷第三個輸入的字符是否匹配第二個,只有第二個也匹配之后才需要進行匹配第一個字符。

  3. 如果匹配成功,則初始值應該 - - ,所有字符串匹配完畢之后,需要看初始值是否為最初賦予的值,如果是則說明所有符號都是合法的,否則說明還有符號沒有匹配上,則不合法 經過這樣的分析之后,寫代碼應該就比較好寫了,比如我們可以這樣實現:

/**
* 判斷字符串是否合法
*      比如: "([)]" 不合法, "[()]" 合法
*/
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中怎么判斷字符串是否合法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女