/*
** file: stack_queue.h
**
** stack + queue with singly linked lists
** UC: 21046 - EDAF @ UAb
** e-fólio A 2025-26
**
** Aluno: 2203810 - João Pires
*/

// Defina:
//   Em stack_queue.h as classes da estrutura de dados
//   Em stack_queue.cpp a implementação dos métodos das classes da estrutura de dados
// ** Não altere o nome das classes nem dos atributos obrigatórios! **

#ifndef _STACK_QUEUE_H
#define _STACK_QUEUE_H

struct INode {
   // atributos obrigatórios
   int item;        // informação em cada nó
   INode *next;     // apontador para o nó seguinte

   // outros atributos e métodos (protótipos) livres
   INode(int value = 0, INode *pnext = 0);
};

class IStack {
private:
   // atributos obrigatórios
   int n;          // dimensão atual da pilha
   INode *ptop;    // topo da pilha

   // outros atributos e métodos (protótipos) livres
public:
   IStack();
   ~IStack();

   bool empty() const;
   int size() const;

   void push(int item);
   void pop();
   int top() const;
   void clear();

   void print() const;
};

class IQueue {
private:
   // atributos obrigatórios
   int n;            // dimensão atual da fila
   INode *pfirst;    // primeiro nó da fila
   INode *plast;     // último nó da fila

   // outros atributos e métodos (protótipos) livres
public:
   IQueue();
   ~IQueue();

   bool empty() const;
   int size() const;

   void enqueue(int item);
   void dequeue();
   int front() const;
   int back() const;
   void clear();

   void print() const;
};

#endif
// EOF