Red de conocimiento informático - Conocimiento informático - Si el orden de inserción en la pila es A, B, C y D, ¿cuál es la posible secuencia para salir de la pila? No estoy buscando una respuesta, sino un código de programación para resolver el problema.

¡Solicita asesoramiento de expertos!

Si el orden de inserción en la pila es A, B, C y D, ¿cuál es la posible secuencia para salir de la pila? No estoy buscando una respuesta, sino un código de programación para resolver el problema.

¡Solicita asesoramiento de expertos!

#include

#include

#define N (4) //N>1

char in_str[N+1] = "ABCD";

int count = 0;

//Organiza todo el rango [start,n)

void Permunation(char *in_str,int start,int n);

//Tenga en cuenta que dado que el número de secuencias pop es C(2n,n)/(n+1), si Cuando n es grande, el conteo será incorrecto y el programa no podrá completarse en poco tiempo.

int main(void)

{

Permunación(in_str,0,N);

printf("Total*** %d tipos de secuencias pop\n",count);

return 0;

}

//Si es la secuencia pop correcta, elimina errores Secuencia: suponga que la secuencia de inserción es p1, p2, p3, p4, entonces la secuencia de error contiene pi, pj, pk y satisface las siguientes condiciones

//Las siguientes condiciones: pj < pk < pi, como en la secuencia pop Contiene p4 p2 p3 (no es necesario que pi, pj, pk sean consecutivos)

// Los p1, p2, p3, p4 aquí corresponden a la secuencia de apilamiento, como A -1, B-2, C- 3, D-4, aquí el carácter ABCD simplemente cumple con esta relación de tamaño, por lo que no es necesario aumentar la matriz de secuencia de pila

int IsPopLiner(const char *pop_str )

{

int len ​​​​= strlen(pop_str);

int i,j,big1,big2;

para (i = 1; i < len - 1; ++i)

{

big1 = i;

for(j = 0; j < i ; ++j) //Seleccione i antes de pop_str[i ]Elemento más grande

if(pop_str[j] > pop_str[big1])

big1 = j;

if(big1 != i) / Hay un elemento mayor que pop_str[i] antes de /i

{

big2 = i;

int one = 1;

for(j = i + 1; j < len; ++j) //Encuentra el elemento más pequeño después de i que sea mayor que pop_str[i]

if(uno && pop_str[j] > pop_str[i ])

{

uno = 0;

big2 = j;

}

else if( pop_str[j] > pop_str[i] && pop_str[j] < pop_str[big2])

big2 = j;

if(big2 != i)

{

if(pop_str[i] < pop_str[big2] && pop_str[big2] < pop_str[big1])

devuelve 0;

}

}

}

return 1;

}

//Realizar una disposición completa de [inicio,n) intervalos

Permunación vacía(char *in_str,int start,int n)

{

int temp;

if(start == n)< / p>

{

if(IsPopLiner(in_str)) //Es la secuencia pop correcta

{

printf("%s\ n ",in_str);

++count;

}

retorno;

}

/ / Cuando está completamente organizado, cada elemento se puede colocar en la posición inicial

for(int i = start; i < n; ++i)

{

if(i != start) //Reducir el autointercambio

{

temp = in_str[start];

in_str[start] = in_str[ i ];

in_str[i] = temp;

}

//Organiza completamente las secuencias restantes

Permunation(in_str, start + 1, n);

//Retroceder

if(i != start) //Reducir el autointercambio

{

temp = in_str[inicio];

in_str[inicio] = in_str[i];

in_str[i] = temp;

}

}

}

// Otro método es utilizar la recursividad para simular la situación de push y pop. ¡Puedes pensar en ello tú mismo, gracias!