用栈实现队列
本题的思路是使用两个栈来实现队列,其中一个栈用来数据in,另一个栈用于数据out。当in栈中有数据而out栈中没有数据时,需要出栈的情况,要把in栈中所有数据push到out栈中,然后出栈。peek同理。
代码如下:
import java.util.Stack;
class MyQueue {
Stack<Integer> stackIn;
Stack<Integer> stackOut;
public MyQueue() {
stackIn = new Stack<>();
stackOut = new Stack<>();
}
public void push(int x) {
stackIn.push(x);
}
public int pop() {
dumpStackIn();
return stackOut.pop();
}
public int peek() {
dumpStackIn();
return stackOut.peek();
}
public boolean empty() {
return stackIn.isEmpty() && stackOut.isEmpty();
}
public void dumpStackIn(){
if(!stackOut.isEmpty()) return;
while(!stackIn.isEmpty()){
stackOut.push(stackIn.pop());
}
}
}
用队列实现栈
本体思路,使用一个队列来实现栈。关键是怎么实现先进后出,当需要出栈的时候,将队尾元素前的元素出队列在进队列,然后弹出即可。
代码如下:
import java.util.ArrayDeque;
import java.util.Deque;
class MyStack {
Deque<Integer> queue ;
public MyStack() {
queue = new ArrayDeque<>();
}
public void push(int x) {
queue.add(x);
}
public int pop() {
rePosition();
return queue.poll();
}
public int top() {
rePosition();
int result = queue.poll();
queue.add(result);
return result;
}
public boolean empty() {
return queue.isEmpty();
}
public void rePosition(){
int size = queue.size();
size--;
while(size-- > 0){
queue.add(queue.poll());
}
}
}
有效的括号
本题思路就是通过栈的应用来解决括号的匹配。不匹配的情况共有三种,左括号多了、右括号多了、括号不匹配。那么我们在遍历字符串的时候,遇到左括号就将它对应的右括号存储进栈,然后遇到对应的右括号出栈,当不匹配,或者栈空了的时候就失败。
代码如下:
import java.util.Stack;
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
char ch;
for(int i = 0;i < s.length();i++){
ch = s.charAt(i);
if(ch == '('){
stack.push(')');
}else if(ch == '{'){
stack.push('}');
}else if(ch == '['){
stack.push(']');
}else if(stack.isEmpty() || stack.peek() != s.charAt(i)){
return false;
}else{
stack.pop();
}
}
return stack.isEmpty();
}
}
删除字符串中的所有相邻重复项
本题也是栈的应用,通过本题理解了栈确实可以用于消除的操作,因为栈可以查看上一个元素是什么。本题如果为空或者不等就入栈,相等就出栈。最后将栈的元素转移到字符串中就可以了。
代码如下:
import java.util.Stack;
class Solution {
public String removeDuplicates(String s) {
Stack<Character> stack = new Stack<>();
char ch;
for(int i = 0;i < s.length();i++){
ch = s.charAt(i);
if(stack.isEmpty() || stack.peek() != ch){
stack.push(ch);
}else {
stack.pop();
}
}
String str = "";
while(!stack.isEmpty()){
str = stack.pop() + str;
}
return str;
}
}
今日八股
- MySQL和Redis的区别是什么
- Redis的优缺点,为什么Redis的查询速度会比较快
今日其他
完成了skiplist的删除以及打印