1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include "../Stack/stack.h"
5
6 int priority(char token);
7 bool isOperator(char token);
8 int calc(int operand1, int oper, int operand2);
9
10 int main()
11 {
12 char postfix[80] = {0};
13 char temp[2] = {0};
14 char token;
15 int* dataPtr;
16 STACK* stack;
17 int i = 0;
18 int operand1;
19 int operand2;
20 int value;
21
22 stack = createStack();
23
24 printf("Enter an infix formula:");
25
26 while((token = getchar()) != '\n'){
27 if(token == '('){
28 dataPtr = (int*) malloc(sizeof(int));
29 *dataPtr = token;
30 pushStack(stack, dataPtr);
31 }
32 else if(token == ')'){
33 dataPtr = (int*)popStack(stack);
34 while(*dataPtr != '('){
35 temp[0] = *dataPtr;
36 strcat(postfix, temp);
37 free(dataPtr);
38 dataPtr = (int*)popStack(stack);
39 }
40 }
41 else if(isOperator(token)){
42 dataPtr = (int*)stackTop(stack);
43 while(!emptyStack(stack) && priority(token) <= priority(*dataPtr)){
44 dataPtr = (int*)popStack(stack);
45 temp[0] = *dataPtr;
46 strcat(postfix, temp);
47 free(dataPtr);
48 dataPtr = (int*)stackTop(stack);
49 }
50 dataPtr = (int*)malloc(sizeof(int));
51 *dataPtr = token;
52 pushStack(stack, dataPtr);
53 }
54 else{
55 temp[0] = token;
56 strcat(postfix, temp);
57 }
58 }
59 while(!emptyStack(stack)){
60 dataPtr = (int*)popStack(stack);
61 temp[0] = *dataPtr;
62 strcat(postfix, temp);
63 }
64
65 printf("The postfix formula is: ");
66 puts(postfix);
67
68 while((token = postfix[i]) != '\0'){
69 if(!isOperator(token)){
70 dataPtr = (int*)malloc(sizeof(int));
71 *dataPtr = atoi(&token);
72 pushStack(stack, dataPtr);
73 }
74 else{
75 dataPtr = (int*)popStack(stack);
76 operand2 = *dataPtr;
77 dataPtr = (int*)popStack(stack);
78 operand1 = *dataPtr;
79 value = calc(operand1, token, operand2);
80 dataPtr = (int*)malloc(sizeof(int));
81 *dataPtr = value;
82 pushStack (stack, dataPtr);
83 }
84 i++;
85 }
86
87 dataPtr = (int*)popStack(stack);
88 value = *dataPtr;
89 printf("The result is %d\n", value);
90
91 destroyStack(stack);
92
93 return 0;
94 }
95
96 int priority(char token)
97 {
98 if(token == '*' || token == '/')
99 return 2;
100 if(token == '+' || token == '-')
101 return 1;
102 return 0;
103 }
104
105 bool isOperator(char token)
106 {
107 if(token == '*' || token == '/' || token == '+' || token == '-')
108 return true;
109 return false;
110 }
111
112 int calc(int operand1, int oper, int operand2)
113 {
114 int result;
115
116 switch(oper)
117 {
118 case '+': result = operand1 + operand2;
119 break;
120 case '-': result = operand1 - operand2;
121 break;
122 case '*': result = operand1 * operand2;
123 break;
124 case '/': result = operand1 / operand2;
125 break;
126 }
127 return result;
128 }