Advertisement
DimasDark

L1Q2 - NEW

Jun 7th, 2013
276
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.28 KB | None | 0 0
  1.     #include <iostream>
  2.     #include <string>
  3.     #include <cstdio>
  4.     using namespace std;
  5.  
  6.  
  7.     //IMPLEMENTAÇÃO DA MINHA PILHA ~
  8.     typedef struct nop
  9.     {
  10.         struct nop* proximo;
  11.         char valor;
  12.  
  13.     } Nop;
  14.  
  15.     typedef struct pilha
  16.     {
  17.         Nop* primeiro;
  18.     } Pilha;
  19.  
  20.     Pilha* inicializarPilha(Pilha* p)
  21.     {
  22.         p->primeiro = NULL;
  23.         return p;
  24.     }
  25.  
  26.     bool isVazia(Pilha* p)
  27.     {
  28.         return p->primeiro == NULL;
  29.     }
  30.  
  31.     Pilha* push(Pilha* p, char v)
  32.     {
  33.         Nop* novo = new Nop();
  34.         novo->valor = v;
  35.         if (p->primeiro == NULL)
  36.         {
  37.             novo->proximo = NULL;
  38.             p-> primeiro = novo;
  39.         }
  40.         else
  41.         {
  42.             novo->proximo = p->primeiro;
  43.             p->primeiro = novo;
  44.         }
  45.         return p;
  46.     }
  47.  
  48.     char pop(Pilha *p)
  49.     {
  50.         char v;
  51.         Nop* aux = p->primeiro;
  52.         v = p->primeiro->valor;
  53.         if (p->primeiro->proximo == NULL)
  54.         {
  55.             p->primeiro = NULL;
  56.         }
  57.         else
  58.         {
  59.             p->primeiro = p->primeiro->proximo;
  60.         }
  61.         delete aux;
  62.         return v;
  63.     }
  64.  
  65.     void mostrarElementos(Pilha *p)
  66.     {
  67.         Nop* aux = p->primeiro;
  68.         while (aux != NULL)
  69.         {
  70.             printf("%c ", aux->valor);
  71.             aux = aux->proximo;
  72.         }
  73.     }
  74.  
  75.     void deletaPilha(Pilha* p)
  76.     {
  77.         Nop* aux = p->primeiro;
  78.         while (aux != NULL)
  79.         {
  80.             Nop* aux2 = aux->proximo;
  81.             delete(aux);
  82.             aux = aux2;
  83.         }
  84.         delete p;
  85.  
  86.     }
  87.  
  88.     //Teste de pilha
  89.     /*int main() {
  90.     Pilha* p = new Pilha();
  91.  
  92.         p = inicializarPilha(p);
  93.  
  94.         p = push(p, '(');
  95.         p = push(p, '(');
  96.         p = push(p, '[');
  97.         p = push(p, 'c');
  98.         mostrarElementos(p);
  99.         pop(p);
  100.         pop(p);
  101.         printf("\n");
  102.         mostrarElementos(p);
  103.  
  104.         return 0;
  105.     } */
  106.  
  107.  
  108.     //IMPLEMENTAÇÃO DA LISTA
  109.  
  110.     //FILA DUPLAMENTE ENCADEADA NO ESTILO LISTA ~DIMAS~DARK~
  111.  
  112.     typedef struct no
  113.     {
  114.         char valor;
  115.         struct no *proximo, *anterior;
  116.     } No;
  117.  
  118.     typedef struct lista
  119.     {
  120.         No* inicio;
  121.         No* fim;
  122.  
  123.     } Lista;
  124.  
  125.  
  126.  
  127.     Lista* inicializa()
  128.     {
  129.         Lista* l = new Lista();
  130.         l ->inicio = l->fim = NULL;
  131.         return l;
  132.     }
  133.  
  134.     int isVazia(Lista* l)
  135.     {
  136.         if (l->inicio == NULL)
  137.             return 1;
  138.         else
  139.             return 0;
  140.     }
  141.  
  142.     //Insere no início
  143.     Lista* insereNoInicio(Lista* l, int v)
  144.     {
  145.         No* novo = new No();
  146.         novo->valor = v;
  147.         novo->anterior = NULL;
  148.         novo->proximo = l->inicio;
  149.         if (l->inicio != NULL)
  150.         {
  151.             l->inicio->anterior = novo;
  152.             l->inicio = novo;
  153.         }
  154.         else
  155.         {
  156.             l->inicio = l->fim = novo;
  157.         }
  158.  
  159.  
  160.         return l;
  161.     }
  162.  
  163.     //Insere no fim
  164.     Lista* insereNoFinal(Lista* l, int v)
  165.     {
  166.         No* novo = new No();
  167.         novo ->valor = v;
  168.         novo ->proximo = NULL;
  169.         novo ->anterior = l->fim;
  170.         if (l->fim != NULL)
  171.         {
  172.             l->fim->proximo = novo;
  173.             l->fim = novo;
  174.         }
  175.         else
  176.             l->inicio = l->fim = novo;
  177.  
  178.  
  179.         return l;
  180.     }
  181.  
  182.     //Funções retira
  183.     No* retiraIni(No* n)
  184.     {
  185.         No* p = n->proximo;
  186.         if (p != NULL)
  187.             p->anterior = NULL;
  188.         delete(n);
  189.         return p;
  190.  
  191.     }
  192.  
  193.     No* retiraFim(No* n)
  194.     {
  195.         No* p = n->anterior;
  196.         if (p != NULL)
  197.             p->proximo = NULL;
  198.         delete(n);
  199.         return p;
  200.     }
  201.  
  202.  
  203.     int retiraDoInicio(Lista* l)   //Remove do inicio e retorna o valor que removeu
  204.     {
  205.         int v;
  206.         v = l->inicio->valor;
  207.         l->inicio = retiraIni(l->inicio);
  208.         if (l->inicio == NULL)
  209.             l->fim = NULL;
  210.         return v;
  211.     }
  212.  
  213.     int retiraDoFinal(Lista* l)   //Retira do final e retorna o valor que removeu
  214.     {
  215.         int v;
  216.         v = l->fim->valor;
  217.         l->fim = retiraFim(l->fim);
  218.         if (l->fim == NULL)
  219.             l->inicio = NULL;
  220.         return v;
  221.     }
  222.  
  223.     int prioridade(char operador)
  224.     {
  225.         int retorno;
  226.         switch (operador)
  227.         {
  228.         case '(':
  229.         {
  230.             retorno = 1;
  231.             break;
  232.         }
  233.         case '+':
  234.         {
  235.             retorno = 2;
  236.             break;
  237.         }
  238.         case '-':
  239.         {
  240.             retorno = 2;
  241.             break;
  242.         }
  243.         case '*':
  244.         {
  245.             retorno = 3;
  246.             break;
  247.         }
  248.         case '/':
  249.         {
  250.             retorno = 3;
  251.             break;
  252.         }
  253.         }
  254.         return retorno;
  255.     }
  256.  
  257.     bool verificaPrioridade(char opr1, char opr2)
  258.     {
  259.         int prioridade1 = prioridade(opr1);
  260.         int prioridade2 = prioridade(opr2);
  261.  
  262.         if (prioridade1 >= prioridade2)
  263.             return true;
  264.         else
  265.             return false;
  266.     }
  267.  
  268.     void mostrarElementos(Lista *l)
  269.     {
  270.         No* aux = l->inicio;
  271.         while (aux != NULL)
  272.         {
  273.             printf("%c ", aux->valor);
  274.             aux = aux->proximo;
  275.         }
  276.     }
  277.  
  278.     //Passa uma string para lista
  279.     void stringNaLista(Lista* l, char* entrada)
  280.     {
  281.         for (int i = 0; entrada[i]; i++)
  282.         {
  283.             l = insereNoFinal(l, entrada[i]);
  284.         }
  285.     }
  286.  
  287.  
  288.  
  289.     string pre2pos(string prefixa)
  290.     {
  291.         Pilha* p = new Pilha();
  292.         string posfixa;
  293.         char x;
  294.  
  295.         for (unsigned int i = 0; prefixa[i] != '\0'; i++)
  296.         {
  297.  
  298.             if (prefixa.at(i)>= '0' && prefixa.at(i) <= '9')
  299.                 posfixa += prefixa.at(i);
  300.             else if (prefixa.at(i) == '+' || prefixa.at(i) == '-' || prefixa.at(i) == '*' || prefixa.at(i) == '/')
  301.             {
  302.                 if (isVazia(p) || p->primeiro->valor == '(')
  303.                 {
  304.                 push(p, prefixa.at(i));
  305.                 }
  306.                 else {
  307.                 while (!isVazia(p) && (verificaPrioridade(p->primeiro->valor, prefixa.at(i))) && p->primeiro->valor != '(')
  308.                 {
  309.                     x = pop(p);
  310.                     cout<< x << "\n";
  311.                     posfixa += x;
  312.                 }
  313.                 push(p, prefixa.at(i));
  314.  
  315.                 }
  316.             }else if (prefixa.at(i) == '(') {
  317.                 push(p, prefixa.at(i));
  318.             }
  319.             else if (prefixa.at(i) == ')')
  320.             {
  321.                 while (p->primeiro->valor != '(')
  322.                 {
  323.                     x = pop(p);
  324.                     cout<< x << "\n";
  325.                     posfixa += x;
  326.  
  327.                 }
  328.                 pop(p);
  329.             }
  330.         }
  331.         while (!isVazia(p))
  332.         {
  333.             x = pop(p);
  334.             cout<< x << "\n";
  335.             posfixa += x;
  336.         }
  337.         delete p;
  338.         return posfixa;
  339.     }
  340.  
  341.  
  342.  
  343.     int main()
  344.     {
  345.         Lista* l = new Lista();
  346.         l = inicializa();
  347.  
  348.         char line[1024];
  349.         string entrada;
  350.         cin.getline(line, 1024);
  351.         entrada = line;
  352.         cout << verificaPrioridade(entrada[2], entrada[5]);
  353.         string saida = pre2pos(entrada);
  354.  
  355.        cout << saida;
  356.  
  357.         return 0;
  358.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement