mihainan

Structuri de date - Nan Mihai

Mar 25th, 2014
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.68 KB | None | 0 0
  1. #define SIZE 50
  2. #include <stdio.h>
  3. #include <malloc.h>
  4. #include <memory.h>
  5.  
  6. /**
  7.  * O structura de date reprezentand o stiva.
  8.  * Pentru implementare se foloseste un tablou alocat dinamic si un contor
  9.  * ce indica numarul de elemente din stiva
  10.  * Se folosesc valori de tipul Stack (ce sunt pointeri la struct _stack)
  11.  *
  12.  */
  13. typedef struct _stack {
  14.     char* data;
  15.     int capacity;
  16.     int size;
  17. }* Stack;
  18.  
  19.  
  20. /** La initializare, capacitatea tabloului de date al stivei este dat de constanta STACK_INITIAL_SIZE*/
  21. #define STACK_INITIAL_SIZE 10
  22.  
  23. /** 1. Creaza o stiva noua*/
  24. Stack init()
  25. {
  26.     Stack nou;
  27.     nou = (Stack) malloc(sizeof(struct _stack));
  28.     nou->capacity = 10;
  29.     nou->data = (char *) malloc(nou->capacity*sizeof(char));
  30.     nou->size = 0;
  31.     return nou;
  32. }
  33.  
  34. /** 2. Elibereaza spatiul folosit de o stiva. Returneaza NULL*/
  35. Stack delete(Stack s)
  36. {
  37.     free(s->data);
  38.     free(s);
  39.     return NULL;
  40. }
  41.  
  42. /** 3. Se asigura ca zona de date are cel putin capacitatea minCapacity*/
  43. void ensureCapacity(Stack s, int minCapacity)
  44. {
  45.     if(s->capacity < minCapacity)
  46.     {
  47.         s->data = (char *) realloc(s->data, minCapacity*sizeof(char));
  48.         s->capacity = minCapacity;
  49.     }
  50. }
  51.  
  52. /** 4. Intoarce true (i.e. 1) daca stiva este goala*/
  53. int isEmpty(Stack s)
  54. {
  55.     if(s->size == 0)
  56.         return 1;
  57.     else
  58.         return 0;
  59. }
  60.  
  61. /** 5. Adauga un element in varful stivei */
  62. void push(Stack s, char value)
  63. {
  64.     if(s->size < s->capacity)
  65.     {
  66.         s->data[s->size] = value;
  67.         s->size++;
  68.     }
  69.     else
  70.     {
  71.         ensureCapacity(s, 2*s->size);
  72.         s->data[s->size] = value;
  73.         s->size++;
  74.     }
  75. }
  76.  
  77. /** 6. Intoarce elementul din varful stivei sau 0 daca stiva e goala*/
  78. char top1(Stack s)
  79. {
  80.     if(s->size == 0)
  81.     {
  82.         return 0;
  83.     }
  84.     else
  85.     {
  86.         return s->data[s->size-1];
  87.     }
  88. }
  89.  
  90. /** 7. Intoarce elementul din varful stivei si il elimina din stiva. Intoarce 0 daca stiva e goala */
  91. char pop(Stack s)
  92. {
  93.     char c;
  94.     if(s->size == 0)
  95.     {
  96.         return 0;
  97.     }
  98.     else
  99.     {
  100.         c = s->data[s->size-1];
  101.         s->size--;
  102.         return c;
  103.     }
  104.    
  105. }
  106.  
  107. void checkValue(char expected, char actual);
  108. void checkEmpty(Stack s, int expected);
  109.  
  110. #define START_TEST(desc) printf("Running#define SIZE 50  %s: %s\n",  __FUNCTION__, desc);
  111.  
  112. void test1234() {
  113.     START_TEST("Init, ensureCapacity, isEmpty and delete");
  114.     Stack s = init();
  115.     checkEmpty(s, 1);
  116.     s = delete(s);
  117.  
  118.     s = init();
  119.     ensureCapacity(s, STACK_INITIAL_SIZE * 2);
  120.     checkEmpty(s, 1);
  121.     s = delete(s);
  122.  
  123.  
  124.     s = init();
  125.     ensureCapacity(s, 1);
  126.     checkEmpty(s, 1);
  127.     s = delete(s);
  128.  
  129.     s = init();
  130.     ensureCapacity(s, 1);
  131.     ensureCapacity(s, STACK_INITIAL_SIZE * 2);
  132.     ensureCapacity(s, STACK_INITIAL_SIZE * 5);
  133.  
  134.     checkEmpty(s, 1);
  135.     s = delete(s);
  136. }
  137.  
  138.  
  139. int prioritate(char c)
  140. {
  141.     switch(c){
  142.         case '(':
  143.             return 1;
  144.         case ')':
  145.             return 2;
  146.         case '+':
  147.         case '-':
  148.             return 3;
  149.         case '*':
  150.         case '/':
  151.             return 4;
  152.         default:
  153.             return 5;
  154.     }
  155. }
  156.  
  157. //Functie 1
  158. /*char aux, ch, a1;
  159.     int p, i;
  160.     i = 0;
  161.     char *text, *rezultat;
  162.     Stack s = init();
  163.     text = (char *) malloc(2000*sizeof(char));
  164.     rezultat = (char *) malloc(2000*sizeof(char));
  165.     fgets(text, 2000, stdin);
  166.     printf("%s\n", text);
  167.     while(text != NULL)
  168.     {
  169.         aux = *text;#define SIZE 50
  170.         text++;
  171.         p = prioritate(aux);
  172.         if(p == 5)
  173.         {
  174.             rezultat[i] = aux;
  175.             i++;
  176.         }
  177.         else
  178.         if(p == 1)
  179.         {
  180.             push(s, aux);
  181.         }
  182.         else
  183.         if(p == 2)
  184.         {
  185.             a1 = pop(s);
  186.             while(a1 != '(')
  187.             {
  188.                 rezultat[i] = a1;
  189.                 i++;
  190.                 a1 = pop(s);
  191.             }
  192.         }
  193.        
  194.     }
  195.     while(s->size > 0)
  196.     {
  197.         a1 = pop(s);
  198.         rezultat[i] = a1;
  199.         i++;
  200.     }
  201.     printf("%s\n", rezultat);*/
  202.  
  203.  
  204. char s[SIZE];
  205. int top = -1;
  206.  
  207. push1(char elem) {
  208.     s[++top] = elem;
  209. }
  210.  
  211. char pop1() {
  212.     return (s[top--]);
  213. }
  214.  
  215. int pr(char elem) {
  216.  switch (elem) {
  217.  case '#':
  218.   return 0;
  219.  case '(':
  220.   return 1;
  221.  case '+':
  222.  case '-':
  223.   return 2;
  224.  case '*':
  225.  case '/':
  226.   return 3;
  227.  }
  228. }
  229.  
  230.  
  231.  
  232.  
  233.  
  234. int main(int argc, char** argv) {
  235.     char infx[50], pofx[50], ch, elem;
  236.     int i = 0, k = 0;
  237.     scanf("%s", infx);
  238.     push1('#');
  239.     while ((ch = infx[i++]) != '\0') {
  240.         if (ch == '(')
  241.             push1(ch);
  242.         else if (isalnum(ch))
  243.             pofx[k++] = ch;
  244.         else if (ch == ')') {
  245.             while (s[top] != '(')
  246.                     pofx[k++] = pop1();
  247.             elem = pop1();
  248.         } else {
  249.             while (pr(s[top]) >= pr(ch))
  250.                     pofx[k++] = pop1();
  251.         push1(ch);
  252.         }
  253.     }
  254.     while (s[top] != '#')
  255.         pofx[k++] = pop1();
  256.     pofx[k] = '\0';
  257.     printf("%s\n", pofx);
  258.     return 0;
  259. }
  260.  
  261. void checkEmpty(Stack s, int expected) {
  262.     int actual = isEmpty(s);
  263.     if(actual != expected) {
  264.         printf("!!! ERROR2: expected %d, got %d\n", expected, actual);
  265.     }
  266. }
  267.  
  268. void checkValue(char expected, char actual) {
  269.     if (expected != actual)
  270.         printf("!!! ERROR3: expected %c, got %c\n", expected, actual);
  271. }
Advertisement
Add Comment
Please, Sign In to add comment