-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathex4_3.c
133 lines (116 loc) · 1.95 KB
/
ex4_3.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
#define MAXSTACK 100
#define BUFSIZE 100
#define MAXOP 50
#define NUMBER '0'
double stack[MAXSTACK];
char buf[BUFSIZE];
int buf_pos = 0;
int stack_pos = 0;
void push(double el)
{
if (stack_pos < MAXSTACK) {
stack[stack_pos++] = el;
}
else {
printf("Error : STACK FULL\n");
}
}
double pop(void)
{
if (stack_pos > 0) {
return stack[--stack_pos];
}
else {
printf("Error : STACK EMPTY\n");
return 0;
}
}
int getch(void)
{
return (buf_pos > 0) ? buf[--buf_pos] : getchar();
}
void ungetch(int c)
{
if (buf_pos >= BUFSIZE) {
printf("Error : BUFFER FULL\n");
}
else {
buf[buf_pos++] = c;
}
}
int getop(char s[])
{
int c, d, i;
while ((c = s[0] = getch()) == ' ' || c == '\t')
;
s[1] = '\0';
if (!isdigit(c) && c != '.' && c != '-')
return c;
i = 0;
if (c == '-') {
if ((d = getch()) == ' ')
return c;
else {
s[++i] = d;
c = d;
}
}
if (isdigit(c))
while (isdigit((c = s[++i] = getch())))
;
if (c == '.')
while (isdigit((c = s[++i] = getch())))
;
s[i] = '\0';
if (c != EOF)
ungetch(c);
return NUMBER;
}
int main()
{
char s[MAXOP];
int type;
double op2;
while ((type = getop(s)) != EOF) {
switch (type) {
case NUMBER:
push(atof(s));
break;
case '+':
push(pop() + pop());
break;
case '*':
push(pop() * pop());
break;
case '-':
op2 = pop();
push(pop() - op2);
break;
case '/':
op2 = pop();
if (op2 == 0)
printf("Error : DIVISION BY ZERO");
else
push(pop() / op2);
break;
case '%':
op2 = pop();
if (op2 == 0)
printf("Error : MODULUS WITH ZERO");
else
push(fmod(pop(), op2));
break;
case '\n':
printf("\t%.8g\n", pop());
break;
default:
printf("Error : INVALID ENTRY");
break;
}
}
return 0;
}