Advertisement
Guest User

Untitled

a guest
Nov 15th, 2018
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.35 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #include <string.h>
  5. #include <stdbool.h>
  6.  
  7. #define STACK_OVERFLOW  -100
  8. #define STACK_UNDERFLOW -101
  9. #define OUT_OF_MEMORY   -102
  10. #define alph "qwertyuiopasdfghjklzxcvbnm"
  11. #define s1 "+*^"
  12. #define s2 "-/^"
  13.  
  14.  
  15.  
  16. struct Stack {
  17.     char element;
  18.     struct Stack *next;
  19. };
  20.  
  21. void push(struct Stack **head, char element) {
  22.     struct Stack *tmp = malloc(sizeof(struct Stack));
  23.     if (tmp == NULL) {
  24.         exit(STACK_OVERFLOW);
  25.     }
  26.     (*tmp).next = *head;
  27.     (*tmp).element = element;
  28.     *head = tmp;
  29. }
  30.  
  31. char pop(struct Stack **head) {
  32.     struct Stack *out;
  33.     char element;
  34.     if (*head == NULL) {
  35.         exit(STACK_UNDERFLOW);
  36.     }
  37.     out = *head;
  38.     *head = (**head).next;
  39.     element = (*out).element;
  40.     free(out);
  41.     return element;
  42. }
  43.  
  44. int findins(char elem) {
  45.     int pos = -1;
  46.     for (int i = 0; i < 3; i++) {
  47.         if (elem == s1[i]) {
  48.             pos = i;
  49.             break;
  50.         }
  51.     }
  52.     if (pos == -1) {
  53.         for (int i = 0; i < 3; i++) {
  54.             if (elem == s2[i]) {
  55.                 pos = i;
  56.                 break;
  57.             }
  58.         }
  59.     }
  60.     return pos;
  61. }
  62.  
  63. void Check(char elem, struct Stack **stack){
  64.     bool letter = false;
  65.     for (int i = 0; i < 26; i++) {
  66.         if (elem == alph[i]) {
  67.             letter = true;
  68.             break;
  69.         }
  70.     }
  71.     char tmp;
  72.     if (letter) {
  73.         printf("%c", elem);
  74.     }
  75.     else {
  76.         if (*stack == NULL) {
  77.             push(stack, elem);
  78.         } else {
  79.             switch (elem) {
  80.                 case '_':
  81.                     tmp = pop(stack);
  82.                     while (*stack != NULL) {
  83.                         printf("%c", tmp);
  84.                         tmp = pop(stack);
  85.                     }
  86.                     break;
  87.                 case '(':
  88.                     push(stack, elem);
  89.                     break;
  90.                 case ')':
  91.                     tmp = pop(stack);
  92.                     while (tmp != '(') {
  93.                         printf("%c", tmp);
  94.                         tmp = pop(stack);
  95.                     }
  96.                     break;
  97.                 default:
  98.                     tmp = pop(stack);
  99.                     if (tmp == '(') {
  100.                         push(stack, tmp);
  101.                         push(stack, elem);
  102.                     } else {
  103.                         if ( (findins(elem) > findins(tmp)) || ((elem == '^') && (tmp == '^')) ) {
  104.                             push(stack, tmp);
  105.                             push(stack, elem);
  106.                         } else {
  107.                             printf("%c", tmp);
  108.                             tmp = pop(stack);
  109.                             while ((findins(elem) <= findins(tmp)) && (tmp != '(') && (tmp != '_')) {
  110.                                 printf("%c", tmp);
  111.                                 tmp = pop(stack);
  112.                             }
  113.                             push(stack, tmp);
  114.                             push(stack, elem);
  115.                         }
  116.                     }
  117.                     break;
  118.             }
  119.         }
  120.     }
  121. }
  122.  
  123. int main() {
  124.     char s[] = "w*(a+b+c*(y-g*d)^n^k+s*l)/(x-f*t*p+w)^e_";
  125.     struct Stack *stack = NULL;
  126.     push(&stack, '_');
  127.     for (int i = 0; i < strlen(s); i++) {
  128.         Check(s[i], &stack);
  129.     }
  130.     return 0;
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement