Un pequeño problema para profundizar en la comprensión de la pila LIFO (Python)

Hoy alguien me hizo una pregunta, de la siguiente manera:
Aquí Insertar imagen Descripción
significa que un orden dado de 654321 pila, la pila de determinar si se cumple lo siguiente.

Ideas de resolución de problemas

Y utilizando el elemento de memoria de pila es seguir una pasada en primero en salir (LIFO), como se muestra a continuación, podemos utilizar una caja medio abierta representa una pila, la pila se denomina extremo abierto, cuyo extremo se dedica a la de empuje (push) y la pila de operación (pop).
Aquí Insertar imagen Descripción
Para una secuencia dada que se determinen, tales como donde la opción A 453 126, se puede deducir realizado secuencialmente en este orden de secuencia,

  • El primero es el primer elemento 4, podemos utilizar este elemento "4" pila original en dos, a saber, un primer paso, la izquierda es el peso original de la pila, el derecho a st_tmp, prestar atención a la dirección de apertura st_tmp opuesto.
  • Entonces primero determinamos si la poligonal actual st la parte superior del elemento de pila "4", si es para que salga, y atravesar el siguiente elemento "5", como un segundo paso,
  • En la misma operación que llegamos a la tercera etapa. Esta vez para atravesar el elemento "3", esta vez en la parte superior izquierda de la pila no significa elemento st "3", por lo que tenemos que encontrar el fin de la parte superior de la pila de st_tmp st y empuje hacia la izquierda y luego salir, este paso se puede simplificar dirigir estallar hacia fuera.
  • Cuando se atraviesa a la cuarta etapa del "1", nos encontramos con que el lado izquierdo de la parte superior de la pila st st_tmp derecho la parte superior de la pila no, en este momento vamos a st_tmp empuje sucesiva la parte superior de la pila a la izquierda hasta encontrar la parte superior de la pila es igual a st_tmp en este punto el elemento de desplazamiento "1" hasta el momento. Si en este momento, por desgracia estallar de todos los elementos st_tmp son también encontró ningún elemento "1", lo que indica que la secuencia no es la secuencia correcta
  • Afortunadamente, se encontró aún elementos "1" y el pop a cabo, como el sexto paso
  • Los siguientes pasos son similares a la operación, si la última pop éxito a cabo todos los elementos de st y st_tmp, lo que indica que la secuencia es correcta, es decir, la secuencia original se puede obtener 654.321 pila a través de una serie de empuje paso / pop.

la implementación del código

Código se implementa de la siguiente manera, donde no sólo se puede realizar la determinación 654321, 4321 también para lograr otro número de dicha determinación, sólo es necesario para las variables del cambio npuede, no sólo el número, lo mismo se aplica para cualquier pila como 343453, etc., sólo se necesita cambiar la inicialización de la pila puede ser.

class StackUnderflow(ValueError):
    '''自定义栈相关的异常类
    '''
    pass

class SStack:
    '''基于顺序表实现的栈类
    '''

    def __init__(self):
        self._elems = []  # 用list对象 _elems存储栈中元素

    def is_empty(self):
        return self._elems == []

    def top(self):  # 取得最后压入的元素,即栈顶
        if self._elems == []:
            raise StackUnderflow("in SStack.pop()")
        else:
            return self._elems[-1]

    def push(self, elem):  # 压栈
        self._elems.append(elem)

    def pop(self):  # 出栈
        if self._elems == []:
            raise StackUnderflow("in SStack.pop()")
        return self._elems.pop()

    def elems(self):
        elems = self._elems
        return elems


st = SStack()
flag = True
# n = int(input("栈元素个数:"))
n = 6 # n也可以改为其他的
for i in range(n, 0, -1):
    st.push(i)
st_tmp = SStack()
input_series = input("输入待判断序列")
series_list = list(map(int, input_series))
print(series_list)

while not st.top() == series_list[0]:  # 以待判断序列首元素为界,将原栈一分为二
    st_tmp.push(st.top())
    st.pop()

for serie in series_list:
    if (not st.is_empty()) and serie == st.top():
        st.pop()
    else:
        if st_tmp.is_empty():
            flag = False
        else:
            while not serie == st_tmp.top():
                st.push(st_tmp.top())
                st_tmp.pop()
                if st_tmp.is_empty():
                    break
            if st_tmp.is_empty():
                flag = False
            else:
                st_tmp.pop()
    if flag == False:
        break

print(flag)

posdata

Si usted piensa que este artículo útil, la bienvenida a los pulgares de recogida + para proporcionar un flujo constante de los bloggers más texto de potencia. También la recepción la atención sobre el número personal de público, el código de dos dimensiones de la siguiente manera:
alt

Publicado 95 artículos originales · elogios ganado 30 · Vistas a 40000 +

Supongo que te gusta

Origin blog.csdn.net/JohnJim0/article/details/105208210
Recomendado
Clasificación