给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。java
这道题让咱们验证输入的字符串是否为括号字符串,包括大括号,中括号和小括号。node
这里咱们使用栈。小程序
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
char[] chars = s.toCharArray();
for (char aChar : chars) {
if (stack.size() == 0) {
stack.push(aChar);
} else if (isSym(stack.peek(), aChar)) {
stack.pop();
} else {
stack.push(aChar);
}
}
return stack.size() == 0;
}
private boolean isSym(char c1, char c2) {
return (c1 == '(' && c2 == ')') || (c1 == '[' && c2 == ']') || (c1 == '{' && c2 == '}');
}
}
复制代码
用两个栈来实现一个队列,完成队列的 Push 和 Pop 操做。数据结构
in 栈用来处理入栈(push)操做,out 栈用来处理出栈(pop)操做。一个元素进入 in 栈以后,出栈的顺序被反转。当元素要出栈时,须要先进入 out 栈,此时元素出栈顺序再一次被反转,所以出栈顺序就和最开始入栈顺序是相同的,先进入的元素先退出,这就是队列的顺序。函数
Stack<Integer> in = new Stack<Integer>();
Stack<Integer> out = new Stack<Integer>();
public void push(int node) {
in.push(node);
}
public int pop() throws Exception {
if (out.isEmpty())
while (!in.isEmpty())
out.push(in.pop());
if (out.isEmpty())
throw new Exception("queue is empty");
return out.pop();
}
复制代码
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的全部数字均不相等。例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不多是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)动画
借用一个辅助的栈,遍历压栈顺序,先讲第一个放入栈中,这里是 1,而后判断栈顶元素是否是出栈顺序的第一个元素,这里是 4,很显然 1≠4 ,因此须要继续压栈,直到相等之后开始出栈。spa
出栈一个元素,则将出栈顺序向后移动一位,直到不相等,这样循环等压栈顺序遍历完成,若是辅助栈还不为空,说明弹出序列不是该栈的弹出顺序。3d
public boolean IsPopOrder(int[] pushSequence, int[] popSequence) {
int n = pushSequence.length;
Stack<Integer> stack = new Stack<>();
for (int pushIndex = 0, popIndex = 0; pushIndex < n; pushIndex++) {
stack.push(pushSequence[pushIndex]);
while (popIndex < n && !stack.isEmpty()
&& stack.peek() == popSequence[popIndex]) {
stack.pop();
popIndex++;
}
}
return stack.isEmpty();
}
复制代码
定义栈的数据结构,请在该类型中实现一个可以获得栈最小元素的 min 函数。code
使用两个 stack,一个做为数据栈,另外一个做为辅助栈。其中 数据栈 用于存储全部数据,而 辅助栈 用于存储最小值。cdn
举个🌰:
入栈的时候:首先往空的数据栈里压入数字 3 ,此时 3 是最小值,因此把最小值压入辅助栈。接下来往数据栈里压入数字 4 。因为 4 大于以前的最小值,所以只要入数据栈,不须要压入辅助栈。
出栈的时候:当数据栈和辅助栈的栈顶元素相同的时候,辅助栈的栈顶元素出栈。不然,数据栈的栈顶元素出栈。
得到栈顶元素的时候:直接返回数据栈的栈顶元素。
栈最小元素:直接返回辅助栈的栈顶元素。
private Stack<Integer> dataStack = new Stack<>();
private Stack<Integer> minStack = new Stack<>();
public void push(int node) {
dataStack.push(node);
minStack.push(minStack.isEmpty() ? node : Math.min(minStack.peek(), node));
}
public void pop() {
dataStack.pop();
minStack.pop();
}
public int top() {
return dataStack.peek();
}
public int min() {
return minStack.peek();
}
复制代码
小程序名称:图解剑指offer
剑指offer上面的 66 道题目都挪上去了,每一道题目基本上都有详细说明解法,更多的解法我还在添加中,须要准备刷题的能够在坐地铁的零碎时间拿出来看看^_^