1、题目要求
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
1、左括号必须用相同类型的右括号闭合。
2、左括号必须以正确的顺序闭合。
3、每个右括号都有一个对应的相同类型的左括号。
2、Java代码
public static boolean isValid(String s) {
//判断提供的字符串是否成对出现
if (s.length() % 2 != 0){
System.out.println("对不起,字符串未成对出现,字符串无效");
return false;
}
Map<Character,Character> map = new HashMap<>();
map.put('(',')');
map.put('[',']');
map.put('{','}');
Stack<Character> stack = new Stack<Character>();
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (ch == '(' || ch == '[' || ch == '{'){
stack.push(ch);
} else if (stack.isEmpty()) {
System.out.println("对不起,栈为空,首字母非左括号");
return false;
} else if (map.get(stack.pop()) != ch ){
System.out.println("对不起,字符串顺序不正确,非有效字符串");
return false;
}
}
return stack.isEmpty();
}
3、成果展示
4、引申思考
LinkedList实现栈和队列的方法
Deque<Character> stack = new LinkedList<>();
//Deque是一个接口
public interface Deque<E> extends Queue<E> {...}
//LinkedList实现了Deque 接口,可以用这种方式实现栈和队列
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{...}
//1、将栈/队列中的元素转化为字符串
toString() 返回值类型:String
//2、获取栈/队列中的元素个数
size(); 返回值类型:int
//3、向栈/队列中直接添加集合
addAll(Collection <?> c) 返回值类型:boolean
//4、栈/队列是否为空
isEmpty() 返回值类型:boolean
//5、双端队列的相关操作
addFirst(Character e) 返回值类型:void
addLast(Character e) 返回值类型:void
pollFirst() 返回值类型:Character
pollLast() 返回值类型:Character
peekFirst() 返回值类型:Character
peekLast() 返回值类型:Character
//6、栈的相关操作
push(Character e) 返回值类型:void //将元素推送到堆栈的顶部
pop() 返回值类型:Character //删除堆栈顶部的对象,并将此对象作为返回值
peek() 返回值类型:Character //查询堆栈顶部的对象(不删除),并将此对象作为返回值
//7、队列的相关操作
add(Character e) 返回值类型:void //不违反容量限制的情况下插入指定元素到队列
poll() 返回值类型:Character //检索并删除此队列的头部,若为空返回null
peek() 返回值类型:Character //检索但不删除此队列的头部,若为空则返回null
//更多详细可查看如下几个接口和类
public interface Queue<E> extends Collection<E> {...}
public class Stack<E> extends Vector<E> {...}
public interface Deque<E> extends Queue<E> {...}
public class LinkedList<E> ....{...}