contenido
Primero, la distinción básica del concepto de pila
2. Operaciones comunes de pila y examen de tipos de preguntas comunes
Primero, la distinción básica del concepto de pila
¿Qué es una pila?
La pila es en realidad una estructura de datos, caracterizada por el último en entrar, el primero en salir
¿Qué es la pila virtual de Java?
En este punto, la pila de la máquina virtual Java es solo una parte de la memoria en la JVM, que generalmente se usa para almacenar, por ejemplo: variables locales
¿Qué es un marco de pila?
Al llamar a una función, abriremos una parte de la memoria en la pila de la máquina virtual JVM para esta función llamada marco de pila
2. Operaciones comunes de pila y examen de tipos de preguntas comunes
1. Operaciones comunes de pila
método | explique |
Empuje E (elemento E) | empujar hacia la pila |
mi pop() | estallido |
E vistazo () | Ver el elemento superior de la pila |
booleano vacío() | Comprobar si la pila está vacía |
1. Probar operaciones comunes:
import java.util.*;
public class TestDemo {
public static void main(String[] args) {
Stack<Integer> stack=new Stack<>();
//入栈
stack.push(1);
stack.push(2);
System.out.println(stack);
//查看栈顶元素
System.out.println(stack.peek());
System.out.println(stack);
//出栈
System.out.println(stack.pop());
System.out.println(stack);
System.out.println(stack.isEmpty());
}
}
Nota: La operación de stack.pop() es sacar el elemento superior de la pila, después de lo cual el elemento superior de la pila ya no existirá.
La operación de stack.peek() es ver el elemento superior de la pila, después de lo cual el elemento superior de la pila todavía existe
2. Pila de implementación hágalo usted mismo
A juzgar por el código fuente, la capa inferior de la pila es una matriz:
import java.util.*;
//自己实现栈
public class MyStack {
public int[] elem;
//判断放入的个数,即容量的大小
public int usedSize;
public MyStack(){
this.elem=new int[5];
}
//关于入栈
public void push(int val){
//第一步,判断是否满栈
if(isFull()){
//扩容
Arrays.copyOf(this.elem,2*this.elem.length);
}
this.elem[this.usedSize]=val;
this.usedSize++;
}
public boolean isFull(){
return this.usedSize==this.elem.length;
}
//出栈
public int pop(){
if(isEmpty()){
throw new RuntimeException("栈为空");
}
int oldVal=this.elem[usedSize-1];
this.usedSize--;
return oldVal;
}
//获取栈顶元素
public int peek(){
if(isEmpty()){
throw new RuntimeException("栈为空");
}
return this.elem[usedSize-1];
}
public boolean isEmpty(){
return this.usedSize==0;
}
}
Preste atención a si se trata de un tipo de referencia o de no referencia al abrir la pila
Categoría 1: Preguntas sobre apilar y hacer estallar
Puntos de análisis:
①El primer paso es comprobar el primer elemento y determinar la secuencia de pila
②Se recomienda dibujar un diagrama de pila para comprender si no está familiarizado con el dialecto
Solución de código: secuencia push y pop de stack =/ta/coding-interviews/question-ranking
import java.util.*; public class Solution { public boolean IsPopOrder(int [] pushA,int [] popA) { Stack<Integer>stack=new Stack<>(); int j=0; for(int i=0;i<pushA.length;i++){ stack.push(pushA[i]); while(j<popA.length&&(!stack.empty())&&stack.peek()==popA[j]){ stack.pop(); j++; } }return stack.empty(); } }
La segunda categoría: expresión de infijo a expresión de posfijo (expresión polaca inversa)
Idea simple para resolver problemas : agregar paréntesis
por ejemplo (5+4)*3-2
①Agregue paréntesis a la expresión donde se encuentra cada operador en la capa más externa
(((5+4)*3)-2)
② Mover todos los símbolos fuera de los corchetes correspondientes
(((54)+3)*2)-
③El orden de los números no cambia, elimina los paréntesis
54+3*2-
¿pensar? ? ? ¿Cómo calcular un valor por expresión de postfijo? ? ?
usar pila
Ideas para resolver problemas:
① Cuando apunte a un número, empuje el número a la pila. Cuando apunte a un operador, coloque los números en la pila a la izquierda y a la derecha.
② Realiza los pasos anteriores
Implementación de código: 150. Evaluación de expresión polaca inversa: LeetCode (leetcode-cn.com) https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
class Solution { public int evalRPN(String[] tokens) { Stack<Integer> stack = new Stack<>(); for(int i = 0;i < tokens.length;i++) { String val = tokens[i]; if(isOperation(val) == false) { //如果不是运算符 stack.push(Integer.parseInt(val)); }else { //到底是什么运算符 int num2 = stack.pop(); int num1 = stack.pop(); switch(val) { case "+": stack.push(num1+num2); break; case "-": stack.push(num1-num2); break; case "*": stack.push(num1*num2); break; case "/": stack.push(num1/num2); break; } } } return stack.pop(); } private boolean isOperation(String x) { if(x.equals("+") || x.equals("-") ||x.equals("*") ||x.equals("/")) { return true; } return false; } }
La tercera categoría:
Paréntesis efectivos para temas clásicos
class Solution { public boolean isValid(String s) { Stack<Character>stack=new Stack<>(); for(int i=0;i<s.length();i++){ char ch=s.charAt(i); if(ch=='('||ch=='['||ch=='{'){ //如果是左括号,直接入栈 stack.push(ch); }else{ //遇到了右括号 if(stack.empty()){ //右括号多 System.out.println("右括号多"); return false; } char top=stack.peek();//哪个左括号 if(top=='{' && ch=='}'||top=='(' && ch==')'||top=='[' && ch==']'){ stack.pop(); }else{ //左右括号不匹配 System.out.println("左右括号不匹配"); return false; } } } if(!stack.empty()){ //左括号多 System.out.println("左括号多"); return false; } return true; } }
Pila mínima de problemas clásicos 155. Pila mínima - LeetCode (leetcode-cn.com) https://leetcode-cn.com/problems/min-stack/ Ideas de solución:
Código relevante:
class MinStack {
private Stack<Integer>stack;
private Stack<Integer>minStack;
public MinStack() {
stack=new Stack<>();
minStack=new Stack<>();
}
public void push(int val) {
stack.push(val);
if(!minStack.empty()){
int top=minStack.peek();
if(top>=val){
minStack.push(val);
}
}else{
minStack.push(val);
}
}
public void pop() {
int popVal=stack.pop();
if(!minStack.empty()){
int top=minStack.peek();
if(popVal==top){
minStack.pop();
}
}
}
public int top() {
return stack.peek();
}
public int getMin() {
return minStack.peek();
}
}