pila en la biblioteca C++ STL

 


Directorio de artículos

  • Introducción a la pila
  • Interfaces comunes de pila
  • Implementación de simulación de pila.
  • Preguntas relacionadas con el DO sobre pilas


1. Introducción a la pila

  • 1. Stack es un adaptador de contenedor que se usa especialmente en contextos con operaciones de último en entrar, primero en salir, su eliminación solo puede insertar y extraer elementos de un extremo del contenedor.
  • 2. La pila se implementa como un adaptador de contenedor. Un adaptador de contenedor encapsula una clase específica como su contenedor subyacente y proporciona un conjunto de funciones miembro específicas para acceder a sus elementos. Utiliza una clase específica como su contenedor subyacente, específico del elemento. (es decir, la parte superior de la pila) se empuja y se abre.
  • 3. El contenedor subyacente de la pila puede ser cualquier plantilla de clase de contenedor estándar o alguna otra clase de contenedor específica. Estas clases de contenedor deben admitir las siguientes operaciones:
    • vacío: operación vacía
    • atrás: Obtener la operación del elemento de cola
    • push_back: operación de inserción de elemento de cola
    • pop_back: operación de eliminación de elemento de cola
  • 4. Los contenedores estándar vector, deque y lista cumplen con estos requisitos. De forma predeterminada, si no se especifica ningún contenedor subyacente específico para la pila, se utiliza deque de forma predeterminada.

 

2. Interfaces comunes de pila.

Descripción de la función Descripción de la interfaz
stack()                                                                                  construye una pila vacía
vacío()                                                                          detecta si la pila está vacía
size()                                                                             devuelve el número de elementos en la pila
top()                                                                                  devuelve una referencia al elemento superior de la pila
push()                                                                          empuja el elemento val a la pila
pop()   muestra el último elemento de la pila                                                                        
swap()                                                                        intercambia el contenido de dos contenedores      

Demostración de interfaz relacionada:

#include <iostream>
#include <stack>

int main()
{
	std::stack<int> st;
	st.push(1);
	st.push(2);
	st.push(3);
	
	while (!st.empty()) {
		std::cout << st.top() << " ";
		st.pop();
	}

	return 0;
}

3. Implementación de simulación de pila.

#pragma once

namespace Stack
{
	//这里默认是采用deque这种适配器来模拟栈
	template<class T,class Contain=std::deque<T>>
	class stack
	{
	public:
		/*
		stack()//这里不需要显示写构造函数,因为是自定义类型,直接调用默认构造函数就行
		{}
		*/

		bool empty()
		{
			return _con.empty();
		}

		size_t size()const
		{
			return _con.size();
		}

		const T& top()const
		{
			return _con.back();
		}

		void push(const T& val)
		{
			_con.push_back(val);
		}

		void pop()
		{
			_con.pop_back();
		}

		void swap(stack<T, Contain>& st)
		{
			std::swap(_con, st._con);
		}

	private:
		Contain _con;

	};
}

4. Preguntas relacionadas con el DO sobre pilas

1. Enlace mínimo al DO

La idea de esta pregunta : configurar una pila auxiliar y una pila mínima puede resolver el problema.

class MinStack {
private:
    stack<int> minST;
    stack<int> tmpST;
public:
    MinStack() {

    }
    
    void push(int val) {
        tmpST.push(val);

        if(minST.empty()||minST.top()>=val)
            minST.push(val);
    }
    
    void pop() {
        if(tmpST.top()==minST.top()){
            tmpST.pop();
            minST.pop();
        }
        else 
        tmpST.pop();
    }
    
    int top() {
        return tmpST.top();
    }
    
    int getMin() {
        return minST.top();
    }
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(val);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->getMin();
 */

2. Enlace DO de secuencia push y pop de pila

Ideas para esta pregunta: uso de esta pregunta

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        if(pushV.size()!=popV.size())//前言如果不满足这两个条件则直接返回false
        return false;
        if(pushV.empty()||popV.empty())
        return false;
        stack<int> ST;//创建出来一个栈
        int i,j=0;
        for(i=0;i<pushV.size();i++)//将压栈数组插入到栈中
        {
            ST.push(pushV[i]);
            while(!ST.empty()&&ST.top()==popV[j])//循环进行遍历操作,如果此时的popV[j]==ST.top(),则出栈
            {
                ST.pop();
                j++;
            }
        }
        if(!ST.empty())
        return false;
        return true;
    }
};

3. Enlace al DO de evaluación de expresión polaca inversa

Idea para esta pregunta: dado que esta pregunta es una expresión de sufijo, el cálculo comienza de izquierda a derecha usando operadores y luego el resultado se coloca en la pila.

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<string> stk;

        for(auto&str:tokens){
            if(str=="+"){
                int x=stoi(stk.top());
                stk.pop();
                int y=stoi(stk.top());
                stk.pop();
                auto sum=[](int x,int y){
                    return x+y;
                };
                stk.push(to_string(sum(x,y)));
            }  
            else if(str=="-"){
                int x=stoi(stk.top());
                stk.pop();
                int y=stoi(stk.top());
                stk.pop();
                auto sub=[](int x,int y){
                    return y-x;
                };
                stk.push(to_string(sub(x,y)));
            }
            else if(str=="*"){
                int x=stoi(stk.top());
                stk.pop();
                int y=stoi(stk.top());
                stk.pop();
                auto mul=[](int x,int y){
                    return x*y;
                };
                stk.push(to_string(mul(x,y)));
            }            
            else if(str=="/"){
                int x=stoi(stk.top());
                stk.pop();
                int y=stoi(stk.top());
                stk.pop();
                auto div=[](int x,int y){
                    return y/x;
                };
                stk.push(to_string(div(x,y)));
            } 
            else {
                stk.push(str);
            }
        }

        return stoi(stk.top());
    }
};

4. Utilice la pila para implementar el enlace DO de la cola

La idea de esta pregunta: use dos pilas, una pila se usa para generar datos y la otra se usa para ingresar datos.

class MyQueue {
    //定义两个栈一个栈用来出数据,一个栈用来插入数据
private:
     stack<int> PushST;
     stack<int> PopST;
public:
    MyQueue() {

    }
    //将数据放入插入数据的栈中
    
    void push(int x) {
           PushST.push(x);

    }
    //如果此时出数据的栈空为空时则将数据导入出数据的栈中
    
    int pop() {
        if(PopST.empty())
        {
            while(!PushST.empty())
            {
                PopST.push(PushST.top());
                PushST.pop();
            }
            
        }
        int ret=PopST.top();
        PopST.pop();
        return ret;

    }
    
    int peek() {
    if(PopST.empty())
        { while(!PushST.empty())
            {
                PopST.push(PushST.top());
                PushST.pop();
            }
           

    }
     return PopST.top();
    }
    
    bool empty() {
        return PushST.empty()&&PopST.empty();

    }
};

/**
 * 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();
 * bool param_4 = obj->empty();
 */

Supongo que te gusta

Origin blog.csdn.net/qq_67458830/article/details/132025786
Recomendado
Clasificación