Java设计一个算法

java给定一个字符串str,设计一个算法采用顺序栈判断str是否为形如“序列1@序列2”的合法字符串,其中序列2是序列1的逆序,在str中恰好只有一个@字符

可以采用顺序栈来实现这个算法。具体步骤如下:

初始化一个顺序栈,用于存储待判断的字符串。

将字符串 str 压入顺序栈中。

遍历顺序栈,对于每个元素,执行以下步骤:

如果元素为@字符,则说明字符串 str 合法,返回 true。
如果元素不是@字符,则将其从顺序栈中弹出,并将其与顺序栈顶部的元素进行比较。
如果顶部元素是序列 1,则将当前元素插入到顶部元素的后面,形成新的序列 1。
如果顶部元素是序列 2,则将当前元素插入到顶部元素的前面,形成新的序列 2。
如果顶部元素不是序列 1 和序列 2,则继续比较下一个元素,直到找到序列 1 或序列 2 为止。
如果遍历顺序栈后仍然没有找到序列 1 和序列 2,则说明字符串 str 不合法,返回 false。

下面是这个算法的 Java 实现代码:

public boolean isLegalString(String str) {  
    Stack<Character> stack = new Stack<>();  
    stack.push(str.charAt(0));  
    while (!stack.empty()) {  
        char peek = stack.peek();  
        if (peek == '@') {  
            return true;  
        } else if (peek != '?') {  
            stack.pop();  
        } else {  
            char next = stack.pop();  
            if (next == '?') {  
                stack.push(peek);  
            } else if (next != peek) {  
                stack.push(next);  
            }  
        }  
    }  
    return false;  
}

其中,stack 变量用于存储待判断的字符串,peek 变量用于获取当前栈顶元素,next 变量用于比较下一个元素。当 peek 为@字符时,说明字符串 str 合法,返回 true;当 peek 不为@字符或?字符时,说明字符串 str 不合法,返回 false。

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/347190
  • 以下回答由chatgpt基于相关博客总结生成:

    我可以设计如下算法:

    1.定义一个顺序栈stack来存储序列1,并定义一个字符串reverseStr来存储序列2的逆序。 2.从字符串的第一个字符开始遍历,遇到@停下,将@之前的字符依次入栈stack中。 3.继续遍历,将@之后的字符依次加到reverseStr中。 4.从stack中依次出栈,与reverseStr中的字符进行比较,如果不相等则说明不是满足要求的合法字符串,返回false。 5.如果栈为空,并且reverseStr为空,说明是满足要求的合法字符串,返回true。

    下面是Java代码实现:

    import java.util.*;
    
    public class ValidString {
        public static boolean isValid(String input) {
            Stack<Character> stack = new Stack<>();
            String reverseStr = "";
            boolean isAt = false;
            for(int i = 0; i < input.length(); i++){
                char ch = input.charAt(i);
                if(ch == '@'){
                    isAt = true;
                    continue;
                }
                if(isAt){
                    reverseStr += ch;
                }
                else{
                    stack.push(ch);
                }
            }
            while(!stack.empty() && !reverseStr.isEmpty()){
                if(stack.pop() != reverseStr.charAt(0)){
                    return false;
                }
                reverseStr = reverseStr.substring(1);
            }
            if(stack.empty() && reverseStr.isEmpty()){
                return true;
            }
            return false;
        }
    
        public static void main(String[] args) {
            String input1 = "abc@dcb";
            String input2 = "abbc@dcb";
            System.out.println(isValid(input1)); // expected output: true
            System.out.println(isValid(input2)); // expected output: false
        }
    }