图解数据结构——字符匹配与回文算法

73 阅读1分钟

上一篇文章说到:顺序栈的基本运算。

此篇文章为:顺序栈的常见算法

字符匹配算法

题目:设计一个算法利用顺序栈检查用户输入的表达式中的字符(例如中括号、小括号、大括号)是否匹配。

思路:

  • 1:首先遍历字符串
    
  • 2:每次遍历一个字符串判断是左括号还是右括号
    
  • 3:若是左括号,直接进栈。若是右括号去栈顶匹配看看有没有与之对应的左括号,若有则进行出栈操作。若没有返回false,当然空栈也返回false
    
  • 4:循环结束以后,判断栈是否为空,若为空说明此字符串的括号都是匹配的,若不为空说明此字符串的括号不匹配
    

图解

匹配图

image.png

不匹配图:

image.png

代码

public boolean MatchParentheses(String str){
    int i =0;
    char e ;       //接受每一项的字符
    SqStackNode<Character> stackNode = new SqStackNode<>();
    while (i<str.length()){
        e = str.charAt(i);
        if(e == '(' || e== '{'|| e== '['){
            stackNode.push(e);
        } else {
            if(e ==')'){
                if(stackNode.isEmpty()) return false;
                if(stackNode.peck() != '(') return false;
                stackNode.pop();
            }
            if (e==']'){
                if(stackNode.isEmpty()) return false;
                if(stackNode.peck() != '[') return false;
                stackNode.pop();
            }
            if (e=='}'){
                if(stackNode.isEmpty()) return false;
                if(stackNode.peck() != '{') return false;
                stackNode.pop();
            }
        }
        i++;
    }
    if (stackNode.isEmpty()) {
        return true;
    }
    return false;
}

回文算法

题目:利用顺序栈判断用户输入的字符串表达式是否回文。(回文:所谓回文就是正过来倒多来读都一样例如ABCBA) 第一种方法思路:

  • 1:将字符串的前半部分入栈。
  • 2:若字符串为奇数跳过中间这个字符(回文中间字符都一样)
  • 3:然后将字符串与入栈的一部分字符串进行匹配若一致出栈直到栈空为返回true;若一个不匹配返回false;

图解

字符串前半部分入栈

image.png

代码

public boolean isPalindrome(String str){
    int i =0;
    SqStackNode<Character> stackNode = new SqStackNode<>();

    int s = str.length()/2;
    while (i<s){
        stackNode.push(str.charAt(i));
        i++;
    }
    if (str.length()%2!=0){
        s++;
    }
    while (!stackNode.isEmpty()){
        if(str.charAt(s) != stackNode.peck() ){
            return false;
        }
        stackNode.pop();
        s++;
    }
    return true;
}