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;
} p >
}
}
// Otro método es utilizar la recursividad para simular la situación de push y pop. ¡Puedes pensar en ello tú mismo, gracias!