¿Cómo puedo imprimir el valor en esta pilaT?
Frecuentes
Visto 488 equipos
0
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)); }
1 Respuestas
8
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 c printing stack typedef or haz tu propia pregunta.
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 '<
'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. - Jonathan Lefflerohmygosh gracias @Jonathan! me acabas de ahorrar tanto tiempo, a pesar de que solo escribí un convertidor: tekknolagi