栈的应用
This commit is contained in:
parent
742d0471b2
commit
5bc369a02d
46
src/main/java/cn/whaifree/leetCode/Stack/LeetCode20.java
Normal file
46
src/main/java/cn/whaifree/leetCode/Stack/LeetCode20.java
Normal file
@ -0,0 +1,46 @@
|
||||
package cn.whaifree.leetCode.Stack;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Deque;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Stack;
|
||||
|
||||
/**
|
||||
* 括号匹配
|
||||
*/
|
||||
public class LeetCode20 {
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
System.out.println(new Solution().isValid("()[]{}"));
|
||||
System.out.println(new Solution().isValid("}"));
|
||||
}
|
||||
|
||||
class Solution {
|
||||
public boolean isValid(String s) {
|
||||
Deque<Character> stack = new LinkedList<>();
|
||||
char[] chars = s.toCharArray();
|
||||
for (char aChar : chars) {
|
||||
if (aChar == '{' || aChar == '[' || aChar == '(') {
|
||||
stack.push(aChar);
|
||||
}else if (aChar == ']'){
|
||||
if (stack.isEmpty() || stack.pop() != '[') {
|
||||
return false;
|
||||
}
|
||||
}else if (aChar == '}'){
|
||||
if (stack.isEmpty() ||stack.pop()!= '{') {
|
||||
return false;
|
||||
}
|
||||
}else if (aChar == ')'){
|
||||
if (stack.isEmpty() || stack.pop() != '(') {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return stack.isEmpty();
|
||||
}
|
||||
}
|
||||
}
|
174
src/main/java/cn/whaifree/leetCode/Stack/LeetCode225.java
Normal file
174
src/main/java/cn/whaifree/leetCode/Stack/LeetCode225.java
Normal file
@ -0,0 +1,174 @@
|
||||
package cn.whaifree.leetCode.Stack;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Deque;
|
||||
import java.util.LinkedList;
|
||||
import java.util.Queue;
|
||||
|
||||
/**
|
||||
* 225. 用队列实现栈
|
||||
*
|
||||
* 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
|
||||
*
|
||||
* 实现 MyStack 类:
|
||||
*
|
||||
* void push(int x) 将元素 x 压入栈顶。
|
||||
* int pop() 移除并返回栈顶元素。
|
||||
* int top() 返回栈顶元素。
|
||||
* boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
|
||||
*
|
||||
* 注意:
|
||||
*
|
||||
* 你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。
|
||||
* 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
|
||||
*
|
||||
* 示例:
|
||||
*
|
||||
* 输入:
|
||||
* ["MyStack", "push", "push", "top", "pop", "empty"]
|
||||
* [[], [1], [2], [], [], []]
|
||||
* 输出:
|
||||
* [null, null, null, 2, 2, false]
|
||||
*
|
||||
* 解释:
|
||||
* MyStack myStack = new MyStack();
|
||||
* myStack.push(1);
|
||||
* myStack.push(2);
|
||||
* myStack.top(); // 返回 2
|
||||
* myStack.pop(); // 返回 2
|
||||
* myStack.empty(); // 返回 False
|
||||
*
|
||||
*/
|
||||
public class LeetCode225 {
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
|
||||
Deque<Integer> objects = new LinkedList<>();
|
||||
objects.add(1);
|
||||
objects.add(2);
|
||||
objects.push(3);
|
||||
System.out.println(objects.pop());
|
||||
// objects.forEach(x -> System.out.println(x));
|
||||
|
||||
|
||||
MyStack1 myStack = new MyStack1();
|
||||
myStack.push(1);
|
||||
myStack.push(2);
|
||||
myStack.push(3);
|
||||
|
||||
System.out.println(myStack.top());
|
||||
System.out.println(myStack.pop());
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 每次入栈就加入其中的非空队列
|
||||
* 出栈就全部移动到另一个队列,并获取最后一个元素
|
||||
*
|
||||
* 队列用add // add 尾巴进
|
||||
* 栈用push // push 头进
|
||||
* pop 头出
|
||||
*
|
||||
* - 栈 push pop
|
||||
* - 队列 add pop
|
||||
*/
|
||||
class MyStack {
|
||||
|
||||
Deque<Integer> queue1;
|
||||
Deque<Integer> queue2;
|
||||
|
||||
public MyStack() {
|
||||
queue1 = new LinkedList<>();
|
||||
queue2 = new LinkedList<>();
|
||||
}
|
||||
|
||||
public void push(int x) {
|
||||
if (!queue1.isEmpty()) {
|
||||
queue1.add(x);
|
||||
} else {
|
||||
queue2.add(x);
|
||||
}
|
||||
}
|
||||
|
||||
public int pop() {
|
||||
if (!queue1.isEmpty()) {
|
||||
// 将queue全部导入queue2,并获取最后一个元素返回
|
||||
while (queue1.size()!=1) {
|
||||
queue2.add(queue1.pop());
|
||||
}
|
||||
return queue1.pop();
|
||||
} else {
|
||||
// 将queue2全部导入queue1,并获取最后一个元素返回
|
||||
while (queue2.size()!=1) {
|
||||
queue1.add(queue2.pop());
|
||||
}
|
||||
return queue2.pop();
|
||||
}
|
||||
}
|
||||
|
||||
public int top() {
|
||||
if (!queue1.isEmpty()) {
|
||||
// 将queue全部导入queue2,并获取最后一个元素返回
|
||||
while (queue1.size()>1) {
|
||||
queue2.add(queue1.pop());
|
||||
}
|
||||
Integer pop = queue1.pop();
|
||||
queue2.add(pop);
|
||||
return pop;
|
||||
} else {
|
||||
// 将queue2全部导入queue1,并获取最后一个元素返回
|
||||
while (queue2.size()>1) {
|
||||
queue1.add(queue2.pop());
|
||||
}
|
||||
|
||||
Integer pop = queue2.pop();
|
||||
queue1.add(pop);
|
||||
return pop;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean empty() {
|
||||
return queue1.isEmpty() && queue2.isEmpty();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* push 的时候 把其替换到头部
|
||||
*/
|
||||
class MyStack1 {
|
||||
|
||||
Deque<Integer> queue;
|
||||
|
||||
|
||||
public MyStack1() {
|
||||
queue = new LinkedList<>();
|
||||
}
|
||||
|
||||
public void push(int x) {
|
||||
queue.add(x);
|
||||
int size = queue.size();
|
||||
while (size != 1) {
|
||||
queue.add(queue.pop());
|
||||
size--;
|
||||
}
|
||||
}
|
||||
|
||||
public int pop() {
|
||||
return queue.pop();
|
||||
}
|
||||
|
||||
public int top() {
|
||||
return queue.peek();
|
||||
}
|
||||
|
||||
public boolean empty() {
|
||||
return queue.isEmpty();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
122
src/main/java/cn/whaifree/leetCode/Stack/LeetCode232.java
Normal file
122
src/main/java/cn/whaifree/leetCode/Stack/LeetCode232.java
Normal file
@ -0,0 +1,122 @@
|
||||
package cn.whaifree.leetCode.Stack;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Deque;
|
||||
import java.util.LinkedList;
|
||||
import java.util.Queue;
|
||||
|
||||
/**
|
||||
* 232. 用栈实现队列
|
||||
*
|
||||
* 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
|
||||
*
|
||||
* 实现 MyQueue 类:
|
||||
*
|
||||
* void push(int x) 将元素 x 推到队列的末尾
|
||||
* int pop() 从队列的开头移除并返回元素
|
||||
* int peek() 返回队列开头的元素
|
||||
* boolean empty() 如果队列为空,返回 true ;否则,返回 false
|
||||
* 说明:
|
||||
*
|
||||
* 你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
|
||||
* 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
|
||||
*
|
||||
* 示例 1:
|
||||
*
|
||||
* 输入:
|
||||
* ["MyQueue", "push", "push", "peek", "pop", "empty"]
|
||||
* [[], [1], [2], [], [], []]
|
||||
* 输出:
|
||||
* [null, null, null, 1, 1, false]
|
||||
*
|
||||
* 解释:
|
||||
* MyQueue myQueue = new MyQueue();
|
||||
* myQueue.push(1); // queue is: [1]
|
||||
* myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
|
||||
* myQueue.peek(); // return 1
|
||||
* myQueue.pop(); // return 1, queue is [2]
|
||||
* myQueue.empty(); // return false
|
||||
*
|
||||
*
|
||||
* 提示:
|
||||
*
|
||||
* 1 <= x <= 9
|
||||
* 最多调用 100 次 push、pop、peek 和 empty
|
||||
* 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)
|
||||
*
|
||||
*
|
||||
* 进阶:
|
||||
*
|
||||
* 你能否实现每个操作均摊时间复杂度为 O(1) 的队列?换句话说,执行 n 个操作的总时间复杂度为 O(n) ,即使其中一个操作可能花费较长时间。
|
||||
*/
|
||||
public class LeetCode232 {
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
MyQueue myQueue = new MyQueue();
|
||||
System.out.println(myQueue.empty());
|
||||
myQueue.push(1);
|
||||
myQueue.push(2);
|
||||
myQueue.push(3);
|
||||
myQueue.push(4);
|
||||
System.out.println(myQueue.peek());
|
||||
System.out.println(myQueue.pop());
|
||||
System.out.println(myQueue.empty());
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
|
||||
一个空的队列不会调用 pop 或者 peek 操作
|
||||
|
||||
* // 进队列,全部放到Enter栈
|
||||
* // 一旦要出栈,检查Out栈有没有,如果没有将目前Enter栈全部弹到Out栈,再弹出第一个
|
||||
*
|
||||
*/
|
||||
class MyQueue {
|
||||
|
||||
Deque<Integer> stackEnter;
|
||||
Deque<Integer> stackOut;
|
||||
|
||||
public MyQueue() {
|
||||
this.stackEnter = new LinkedList<>();
|
||||
this.stackOut = new LinkedList<>();
|
||||
}
|
||||
|
||||
public void push(int x) {
|
||||
stackEnter.push(x);
|
||||
}
|
||||
|
||||
public int pop() {
|
||||
int peek = peek();
|
||||
stackOut.pop();
|
||||
return peek;
|
||||
}
|
||||
|
||||
public int peek() {
|
||||
if (stackOut.isEmpty()) {
|
||||
while (!stackEnter.isEmpty()) {
|
||||
stackOut.push(stackEnter.pop());
|
||||
}
|
||||
}
|
||||
// 不会对空操作
|
||||
return stackOut.peek();
|
||||
}
|
||||
|
||||
public boolean empty() {
|
||||
return stackEnter.isEmpty() && stackOut.isEmpty();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Your MyQueue object will be instantiated and called as such:
|
||||
* MyQueue obj = new MyQueue();
|
||||
* obj.push(x);
|
||||
* int param_2 = obj.pop();
|
||||
* int param_3 = obj.peek();
|
||||
* boolean param_4 = obj.empty();
|
||||
*/
|
||||
}
|
Loading…
Reference in New Issue
Block a user