Arnab_Manna

infix to podtfix using stack in C

Jun 4th, 2020
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.97 KB | None | 0 0
  1. /*
  2. Queue implementation using
  3. double ways linked list representations
  4. Here two pointers are required and these are Q.Rear and Q.Front
  5. For single element queue both left and right pointers
  6. are NULL.
  7. */
  8. #include<stdio.h>
  9. #include<stdlib.h>
  10. #include<conio.h>
  11. #include<string.h>
  12.  
  13. #define MAXSIZE 8
  14.  
  15. #define TRUE 1
  16. #define FALSE 0
  17.  
  18. typedef unsigned char Boolean;
  19.  
  20. typedef struct Node_tag
  21. {
  22.     char Data;
  23.     struct Node_tag *LLink;
  24.     struct Node_tag *RLink;
  25. } NODE;
  26.  
  27. NODE *GetNode()
  28. {
  29.     NODE *New;
  30.     New = (NODE *) malloc(sizeof(NODE));
  31.     New ->LLink = NULL;
  32.     New ->RLink = NULL;
  33.     return New;
  34. }
  35.  
  36. typedef struct Stack
  37. {
  38.     NODE *Top;
  39. } STACK;
  40.  
  41.  
  42. STACK Initialize(STACK S)
  43. {
  44.     S.Top = NULL;
  45.     return S;
  46. }
  47.  
  48. Boolean IsFull(STACK S)
  49. {
  50.     NODE *New;
  51.     New = GetNode();
  52.     if(New==NULL)
  53.         return TRUE;
  54.     else
  55.         {
  56.             free(New);
  57.             return FALSE;
  58.         }
  59. }
  60.  
  61. Boolean IsEmpty(STACK S)
  62. {
  63.     if (S.Top == NULL)
  64.         return TRUE;
  65.     else
  66.         return FALSE;
  67. }
  68.  
  69. STACK Push(STACK S, char x)
  70. {
  71.     NODE *New;
  72.     New = GetNode();
  73.     if(New==NULL)
  74.         {
  75.             printf("\n STACK overflow error");
  76.             return S;
  77.         }
  78.     New->Data = x;
  79.     if (S.Top== NULL)
  80.     {
  81.         S.Top = New;
  82.     }
  83.     else
  84.     {
  85.         New->RLink=S.Top;
  86.         S.Top->LLink = New;
  87.         S.Top=New;
  88.     }
  89.     return S;
  90. }
  91.  
  92.  
  93. /*
  94. STACK Insert(STACK Q, int x)
  95. {
  96.     int i;
  97.     if (Q.Front==0)
  98.         {
  99.             printf("\n STACK overflow error");
  100.             return Q;
  101.         }
  102.     if (Q.Rear == -1)
  103.     {
  104.         Q.Rear = Q.Front = MAXSIZE - 1;
  105.     }
  106.     else
  107.         for(i=Q.Front;i<MAXSIZE;i++)
  108.             Q.Data[i-1]=Q.Data[i];
  109.     Q.Data[Q.Rear] = x;
  110.     return Q;
  111. }
  112. */
  113.  
  114. STACK Pop(STACK S, char *x)
  115. {
  116.     NODE *Del;
  117.     if (S.Top == NULL)
  118.     {
  119.         printf("\n STACK underflow error");
  120.         return S;
  121.     }
  122.     Del = S.Top;
  123.     S.Top = Del->RLink;
  124.     if (S.Top!=NULL)
  125.     {
  126.         S.Top->LLink = NULL;
  127.         Del->RLink = NULL;
  128.     }
  129.     *x = Del->Data;
  130.     free(Del);
  131.     return S;
  132. }
  133.  
  134. /*
  135. STACK Delete(STACK Q, int *x)
  136. {
  137.     int i;
  138.     if (Q.Front == -1)
  139.     {
  140.         printf("\n STACK underflow error");
  141.         return Q;
  142.     }
  143.     *x = Q.Data[Q.Front];
  144.     if (Q.Front == Q.Rear)
  145.         Q.Front = Q.Rear = -1;
  146.     else
  147.         {
  148.             for(i=0;i<Q.Rear;i++)
  149.                 Q.Data[i] = Q.Data[i+1];
  150.         }
  151.         Q.Rear= Q.Rear - 1;
  152.     return Q;
  153. }
  154. */
  155.  
  156. void Display(STACK S)
  157. {
  158.     NODE *Ptr=S.Top;
  159.     if (S.Top == NULL)
  160.     {
  161.         printf("\nEmpty STACK");
  162.         return;
  163.     }
  164.     printf("\nCurrent content of the STACK:");
  165.     while(1)
  166.     {
  167.         if (Ptr==NULL) return;
  168.         printf("%c ", Ptr->Data);
  169.         Ptr=Ptr->RLink;
  170.     }
  171. }
  172.  
  173. /*
  174. MAXSIZE = 10
  175. Front = -1
  176. Rear = -1
  177. 0 1 2 3 4 5 6 7 8 9
  178.  
  179. 0 1 2 3 4 5 6 7 8 9
  180. A
  181. Front = 0
  182. Rear = 0
  183.  
  184. 0 1 2 3 4 5 6 7 8 9
  185. A B
  186. Front = 0
  187. Rear = 1
  188.  
  189. 0 1 2 3 4 5 6 7 8 9
  190. A B C
  191. Front = 0
  192. Rear = 2
  193.  
  194. 0 1 2 3 4 5 6 7 8 9
  195. I J H U B C D E F G
  196. Front = 4
  197. Rear = 3
  198. */
  199.  
  200. /*
  201. 9+8-4
  202. 98+4-
  203. $9
  204. $9 8
  205. $17
  206. $17 4
  207. $13
  208.  
  209. 8+4*6/9-(4+6)
  210.  
  211. (((())())))()
  212.  
  213. Home Work:
  214. [([{}{}])]({})
  215. */
  216. /*
  217. Boolean IsAlgebric(char Str[100])
  218. {
  219.     STACK S;
  220.     int i=0;
  221.     char c;
  222.     S = Initialize(S);
  223.     printf("\nInput string: %s\n", Str);
  224.     while(Str[i]!='\0' && Str[i]!='\n')
  225.     {
  226.         //printf("%c ", Str[i]);
  227.    
  228.         if(Str[i] !='(' && Str[i]!=')')
  229.         {
  230.             printf("\nInvalid Character\n");
  231.             return FALSE;
  232.         }
  233.         if(Str[i] == '(')
  234.             S = Push(S, Str[i]);
  235.         if(Str[i] == ')')
  236.             {
  237.                 if(IsEmpty(S))
  238.                     return FALSE;
  239.                 S = Pop(S, &c);
  240.             }
  241.         Display(S);
  242.         i++;
  243.     }
  244.     if(!IsEmpty(S))
  245.         return FALSE;
  246.     else
  247.         return TRUE;
  248. }
  249. */
  250.  
  251. Boolean IsDigit(char c)
  252. {
  253.     if(c<'0' || c>'9')
  254.         return FALSE;
  255.     else
  256.         return TRUE;
  257. }
  258.  
  259.  
  260. Boolean IsOperator(char c)
  261. {
  262.     if(c=='+' || c=='-' || c=='*' || c=='/')
  263.         return TRUE;
  264.     else
  265.         return FALSE;
  266. }
  267.  
  268.  
  269. /*
  270. 3+(7-8*6)/7
  271. Stack   Symb      Output
  272. $       3        
  273. $       +         3
  274. $+      (         3
  275. $+(     7         3
  276. $+(     -         37
  277. $+(-    8         37
  278. $+(-    *         378
  279. $+(-*   6         378
  280. $+(-*   )         3786
  281. $+      /         3786*-
  282. $+/     7         3786*-
  283. $+/     EOS       3786*-7
  284. $                 3786*-7/+
  285.  
  286. 3786*-7/+
  287. $     3
  288. $3    7
  289. $37   8
  290. $378  6
  291. $3786 *
  292. $37 48 -
  293.  
  294. */
  295.  
  296.  
  297. Boolean IsPrecede(char Opr1, char Opr2)
  298. {
  299.     char Operators[] = {'/','*','+','-'};
  300.     int Preced1,Preced2;
  301.     for(Preced1=0;Preced1<4;Preced1++)
  302.         if (Operators[Preced1]==Opr1)break;
  303.     if (Preced1==4)
  304.     {
  305.         printf("\nInvalid operator");
  306.         exit(0);
  307.     }
  308.     for(Preced2=0;Preced2<4;Preced2++)
  309.         if (Operators[Preced2]==Opr2)break;
  310.     if (Preced2==4)
  311.     {
  312.         printf("\nInvalid operator");
  313.         exit(0);
  314.     }
  315.     if (Preced1<Preced2)
  316.         return TRUE;
  317.     else
  318.         return FALSE;
  319. }
  320.  
  321. Boolean PopnTest(STACK S, char Symb)
  322. {
  323.     char Opr;
  324.     if (IsEmpty(S))
  325.         return TRUE;
  326.     S = Pop(S, &Opr);
  327.     S = Push(S, Opr);
  328.     if (Opr == '(')
  329.         return TRUE;
  330.     if (IsPrecede(Symb,Opr))
  331.         return TRUE;   
  332.     return FALSE;
  333. }
  334.  
  335. void InFixToPostFix(char Expr[100], char PExpr[100])
  336. {
  337.     STACK S;
  338.     int i=0, j=0;
  339.     char Symb, PopSymb;
  340.     S = Initialize(S);
  341.    
  342.     // printf("\nInput string: %s\n", Expr);
  343.     Symb = Expr[i];
  344.     while(Symb!='\0' && Symb!='\n')
  345.     {
  346.         printf("\n%c ", Symb);
  347.         if(IsDigit(Symb))
  348.         {
  349.             PExpr[j] = Symb;
  350.             j++;
  351.         }
  352.         else
  353.             if(Symb == '(')
  354.                 S = Push(S, Symb);
  355.             else
  356.                 if(Symb == ')')
  357.                 {
  358.                     while(TRUE)
  359.                     {
  360.                         if(IsEmpty(S))
  361.                         {      
  362.                             printf("\nInvalid Expression");
  363.                             exit(0);
  364.                         }
  365.                         S = Pop(S, &PopSymb);
  366.                         if(PopSymb =='(') break;
  367.                             PExpr[j] = PopSymb;
  368.                             j++;
  369.                     }
  370.                 }
  371.                 else   
  372.                     if(IsOperator(Symb))
  373.                         {
  374.                             while(TRUE)
  375.                             {
  376.                                 if(PopnTest(S,Symb))
  377.                                 {
  378.                                     S = Push(S, Symb);
  379.                                     break;
  380.                                 }
  381.                                 else
  382.                                 {
  383.                                     S = Pop(S, &PopSymb);
  384.                                     PExpr[j] = PopSymb;
  385.                                     j++;
  386.                                 }
  387.                             }
  388.                         }
  389.                     else
  390.                         {
  391.                             printf("\nInvalid Expression");
  392.                                 exit(0);   
  393.                         }  
  394.         i++;
  395.         Symb = Expr[i];
  396.     }
  397.     while(!IsEmpty(S))
  398.     {
  399.         S = Pop(S, &PopSymb);
  400.         PExpr[j] = PopSymb;
  401.         j++;
  402.     }
  403.     PExpr[j]='\0';
  404. }
  405.  
  406.  
  407. main()
  408. {
  409.     char Expr[100],PExpr[100];
  410.     printf("\nEnter a expression:");
  411.     scanf("%s", &Expr);
  412.     printf("\nInput string:%s", Expr);
  413.     InFixToPostFix(Expr, PExpr);
  414.     printf("\nOutput post-fix expression = %s\n\n",PExpr);
  415. }
Add Comment
Please, Sign In to add comment