Tipos de Dados Abstractos: Pilha
From Wiki**3
Interface
O exemplo seguinte (adaptado de Sedgewick) apresenta a interface de uma pilha. A interface define as operações de inicialização (STACKinit
), teste de pilha vazia (STempty
), e inserção/remoção de elementos (STACKpush
/STACKpop
). Note-se que este tipo de dados abstracto não é de 1ª ordem.
#ifndef __STACK_H__ #define __STACK_H__ #include "Item.h" void STACKinit(int); int STACKempty(); void STACKpush(Item); Item STACKpop(); #endif
Implementação
Implementação com vector
#include <stdlib.h> #include "Item.h" #include "STACK.h" static Item *s; static int N; void STACKinit (int maxN) { s = malloc(maxN * sizeof(Item)); N = 0; } int STACKempty() { return N == 0; } void STACKpush (Item it) { s[N++] = it; } Item STACKpop () { return s[--N]; } /* e se N≤0? */
Implementação com lista
#include <stdlib.h> #include "Item.h" typedef struct STACKnode *link; struct STACKnode { Item item; link next; }; static link head; link NEW(Item item, link next) { link x = malloc(sizeof *x); x->item = item; x->next = next; return x; } void STACKinit(int maxN) { head = NULL; } int STACKempty() { return head == NULL; } void STACKpush(Item item) { head = NEW(item, head); } Item STACKpop() { Item item = head->item; /* problema: e se a pilha está vazia? */ link t = head->next; free(head); head = t; return item; }
Cliente
Conversor de notação infix para notação postfix
#include <stdio.h> #include <string.h> #include "Item.h" /* também é incluÃdo via STACK.h; define Item como char */ #include "STACK.h" main(int argc, char *argv[]) { char *a = argv[1]; int i, N = strlen(a); STACKinit(N); for (i = 0; i < N; i++) { if (a[i] == ')') printf("%c ", STACKpop()); if (a[i] == '+' || a[i] == '*') STACKpush(a[i]); if (a[i] >= '0' && a[i] <= '9') printf("%c ", a[i]); } printf("\n"); }
Calculadora RPN
#include <stdio.h> #include <string.h> #include "Item.h" /* também é incluÃdo via STACK.h; define Item como int */ #include "STACK.h" #define DIGIT(d) (a[i] >= '0' && a[i] <= '9') main(int argc, char *argv[]) { char *a = argv[1]; int i, N = strlen(a); STACKinit(N); for (i = 0; i < N; i++) { if (a[i] == '+') STACKpush(STACKpop() + STACKpop()); if (a[i] == '*') STACKpush(STACKpop() * STACKpop()); if (DIGIT(a[i])) STACKpush(0); while (DIGIT(a[i])) STACKpush(10 * STACKpop() + (a[i++] - '0')); } printf("%d \n", STACKpop()); }