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。
我可以设计如下算法:
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
}
}