¿Cómo puedo imprimir el valor en esta pilaT?

Encontré un código para hacer una implementación en C de pilas y decidí usarlo. Sin embargo, había varias definiciones de tipos y tengo dificultades para imprimir los valores en una pilaT (en realidad, una matriz de caracteres). A continuación se muestra el código. ¿Qué estoy haciendo mal?

#incluir #incluir typedef char stackElementT; typedef struct {stackElementT * contenido; int maxSize; int top; } stackT; vacío StackInit (stackT * stackP, int maxSize) {stackElementT * newContents; newContents = (stackElementT *) malloc (sizeof (stackElementT) * maxSize); if (newContents == NULL) {fprintf (stderr, "No hay suficiente memoria. \ n"); salida (1); } stackP-> contents = newContents; stackP-> maxSize = maxSize; stackP-> top = -1; // vacío ...} void StackDestroy (stackT * stackP) {free (stackP-> contenido); stackP-> contenido = NULL; stackP-> maxSize = 0; stackP-> top = -1; // vacío} int StackIsEmpty (stackT * stackP) {return stackP-> top <0; } int StackIsFull (stackT * stackP) {return stackP-> top> = stackP-> maxSize-1; } vacío StackPush (stackT * stackP, elemento stackElementT) {if (StackIsFull (stackP)) {fprintf (stderr, "No se puede empujar el elemento: la pila está llena. \ n"); salida (1); } stackP-> contenido [++ stackP-> top] = elemento; } stackElementT StackPop (stackT * stackP) {if (StackIsEmpty (stackP)) {fprintf (stderr, "No se puede sacar el elemento: la pila está vacía. \ n"); salida (1); } return stackP-> contenido [stackP-> top--]; } void StackDisplay (stackT * stackP) {if (StackIsEmpty (stackP)) {fprintf (stderr, "No se puede mostrar: la pila está vacía. \ n"); salida (1); } int i; printf ("["); for (i = 0; i <stackP-> top; i ++) {printf ("% c,", stackP [i]); // el problema ocurre AQUÍ} printf ("% c]", stackP [stackP-> top]); } int postfix (char * expr, int longitud) {int i; stackT stack; StackInit (y pila, 1000); int temp; for (i = 0; i <length; i ++) {if ((expr [i]> = 48) && (expr [i] <= 57)) {printf ("¡Es un número! Presionado% d \ n", expr [i]); StackPush (& stack, expr [i]); } else {cambiar (expr [i]) {caso 43: {temp = StackPop (& stack); StackPush (& stack, StackPop (& stack) + temp); } pausa; caso 45: {temp = StackPop (& stack); StackPush (& stack, StackPop (& stack) -temp); } pausa; caso 47: {temp = StackPop (& stack); StackPush (& stack, StackPop (& stack) / temp); } pausa; caso 42: {temp = StackPop (& stack); StackPush (& stack, StackPop (& stack) * temp); } pausa; predeterminado: descanso; }}} return StackPop (& stack); } int main () {int i; char * expr = "1 2 3 + * 3 2 1 - + *"; para (i = 0; expr [i]! = '\ 0'; i ++); printf ("% d \ n", sufijo (expr, i)); }

preguntado el 07 de junio de 11 a las 23:06

Para su información, @tekknolagi, puede escribir su código normalmente (sin usar pestañas), y luego seleccionar el código y presionar la tecla 'código'{}'encima del cuadro de texto, y su código se sangrará con cuatro espacios y se formateará automáticamente. No necesitas convertir '<' a '&lt;'etc. Buen cielo; la mayoría de las personas no convertirían su código de esa manera si fuera necesario, irían a otro lugar. -

ohmygosh gracias @Jonathan! me acabas de ahorrar tanto tiempo, a pesar de que solo escribí un convertidor:

1 Respuestas

El compilador (GCC 4.2.1 en MacOS X 10.6.7) me dice:

$ cc -O -std=c99 -Wall -Wextra     st.c   -o st
st.c: In function ‘StackDisplay’:
st.c:72: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘stackT’
st.c:74: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘stackT’
$

En mi versión del código, estas dos líneas son las printf() declaraciones en StackDisplay(), justo donde dice que tiene problemas.

void StackDisplay(stackT *stackP)
{
    if(StackIsEmpty(stackP)) {
        fprintf(stderr, "Can't display: stack is empty.\n");
        exit(1);
    }
    int i;
    printf("[ ");
    for (i = 0; i < stackP->top; i++) {
        printf("%c, ", stackP[i]); //the problem occurs HERE
    }
    printf("%c ]", stackP[stackP->top]);
}

Probablemente quieras stackP->contents[i]. Con esa solución, el programa 'se ejecuta' pero produce:

Can't pop element: stack is empty.

Ese es tu problema para resolverlo ahora.

(Oh, también arreglé el punto y coma perdido después del for incluyete main() como se diagnosticó en los comentarios.)

El bucle debe escribirse como strlen(expr) (y luego necesitas #include <string.h>). De hecho, el cuerpo del programa principal se simplifica a:

char* expr = "1 2 3 + * 3 2 1 - + *";
printf("%d\n", postfix(expr, strlen(expr)));

Normalmente deberías mantener top indexado a la siguiente ubicación a usar, por lo que el valor inicial normalmente sería 0 más bien que -1.

No aprenda los códigos ASCII para los dígitos; olvídese de que lo hizo.

    if ((expr[i] >= 48) && (expr[i] <= 57)) {

Deberías escribir:

    if ((expr[i] >= '0') && (expr[i] <= '9')) {

o mejor (pero tienes que #include <ctype.h> también):

    if (isdigit(expr[i])) {

Se aplican comentarios similares al cambio:

        switch (expr[i]) {
            case 43: {
                temp = StackPop(&stack);
                StackPush(&stack, StackPop(&stack)+temp);
            }
                break;

No estoy seguro de la lógica detrás de la sangría, pero ese 43 debería escribirse como '+', 45 como '-', 47 como '/'y 42 como'*'.


Esto genera:

Is a number! Pushed 49
Is a number! Pushed 50
Is a number! Pushed 51
Is a number! Pushed 51
Is a number! Pushed 50
Is a number! Pushed 49
68

Si arregla el código de pulsación de número como se muestra:

printf("Is a number! Pushed %d\n", expr[i] - '0');
StackPush(&stack, expr[i] - '0');

Entonces obtienes:

Is a number! Pushed 1
Is a number! Pushed 2
Is a number! Pushed 3
Is a number! Pushed 3
Is a number! Pushed 2
Is a number! Pushed 1
20

Y con un poco más de instrumentación, en la línea de:

temp = StackPop(&stack);
printf("Sub: result %d\n", temp);
StackPush(&stack, temp);

después de cada operación, el resultado es:

Is a number! Pushed 1
Is a number! Pushed 2
Is a number! Pushed 3
Add: result 5
Mul: result 5
Is a number! Pushed 3
Is a number! Pushed 2
Is a number! Pushed 1
Sub: result 1
Add: result 4
Mul: result 20
20

Estabas cerca.

Respondido el 08 de junio de 11 a las 05:06

Fantástica respuesta, desearía tener un +1 extra para darte. Felicitaciones por tomarse el tiempo para llevar a este tipo por el camino correcto. - Adán Maras

Guau. Esto fue más allá de los requisitos, y muchas gracias por ello. Como dice @adam, me gustaría poder darte más de un +1. - teknolagi

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.