栈的几个经典应用,真的绝了

面试七股多一股 2024-02-10 08:22:11
一、我们了解的栈

自从最开始接触栈之后,我就知道了栈是一个先进后出数据结构,一直到现在也没忘记这个特点。也就是说访问栈里面的元素顺序是从最近插入的开始访问。但是栈的使用场景其实了解的不多,本文就来总结下栈有哪些经典使用场景吧。

二、栈的经典应用

1、栈其实可以用来实现队列。

栈的特点是先进后出,而队列的特点是先进先出。

如果我们使用两个栈,可以实现队列的功能,双栈实现队列。

如上图,我们通过将第一个栈的数据导入第二个栈,再通过第二个栈出栈,实现队列先进先出的特性。

2、栈可以用于对称匹配,如匹配有效的括号,有效的算式表达式。

比如有一串括号字符串,([{}]),我们需要判断括号是否完全匹配。

通过将一边的括号入栈,遇到了对边的括号,需要出栈匹配。

我们可以发现,}])和出栈的括号顺序可以匹配,如果括号完全匹配,那么最终栈里面没有一个元素。

三、栈应用实战

leetcode20. 有效的括号

class Solution { public boolean isValid(String s) { int n = s.length(); //存储关系 Map<Character, Character> map = new HashMap<Character, Character>() {{ put(')', '('); put(']', '['); put('}', '{'); }}; Stack<Character> stack = new Stack<Character>(); for (int i = 0; i < n; i++) { char ch = s.charAt(i); //是右边的括号 if (map.containsKey(ch)) { //栈顶没有匹配的左边括号 if (stack.isEmpty() || stack.peek() != map.get(ch)) { return false; } stack.pop(); } else { //左边的括号,入栈 stack.push(ch); } } //栈里如果还要括号,则不匹配 return stack.isEmpty(); }}

leetcode232. 用栈实现队列

class MyQueue { Stack<Integer> stack1 = new Stack<>(); Stack<Integer> stack2 = new Stack<>(); public MyQueue() { } public void push(int x) { stack1.push(x); } public int pop() { if(!stack2.isEmpty()) { return stack2.pop(); } while(!stack1.isEmpty()) { stack2.push(stack1.pop()); } if(!stack2.isEmpty()) { return stack2.pop(); } return 0; } public int peek() { if(!stack2.isEmpty()) { return stack2.peek(); } while(!stack1.isEmpty()) { stack2.push(stack1.pop()); } if(!stack2.isEmpty()) { return stack2.peek(); } return 0; } public boolean empty() { return stack1.isEmpty() && stack2.isEmpty(); }}四、总结

栈的特性先进后出理解很简单,但是实际操作是有一定难度的,看完栈的应用,发现栈可以解决的问题还是非常有意思的。

0 阅读:0