Pila de versión java de estructura de datos

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 

20. Paréntesis válidos - LeetCode (leetcode-cn.com) https://leetcode-cn.com/problems/valid-parentheses/

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();
    }
}

Supongo que te gusta

Origin blog.csdn.net/weixin_58850105/article/details/122509541
Recomendado
Clasificación