View difference between Paste ID: uGAK7mjy and WEDwmWF5
SHOW: | | - or go back to the newest paste.
1
#define _CRT_SECURE_NO_WARNINGS
2
#include <stdio.h>
3
#include <stdlib.h>
4
#include <iostream>
5
#include <string.h>
6
#include <ctype.h>
7
8
#define SIZE 100
9
10
char* POST_IN_INFIC(char*);
11
int calculator(char*);
12
void Infic_in_Post(char* s);
13
14
struct list_t {
15
	char data;
16
	list_t *next;
17
	list_t *prev;
18
};
19
20
list_t *head, *tail;
21
int n;
22
23
void Push(char);
24
void Pop(void);
25
void Del(void);
26
void Init(void);
27
void Show(void);
28
bool Empty(void);
29
void Find(char,char);
30
31
32
enum CHOICE {	// Выбор пользователя
33
	QUIT = 0,
34
	INFICINPOST,
35
	CALCULATOR,
36
	OTHER
37
};
38
39
CHOICE DoMenu(void);
40
41
int main()
42
{
43
	freopen("err.txt", "w", stderr);
44
	head=NULL;
45
	char* s;
46
	s=(char*)malloc(100*sizeof(char));
47
	int choice = -1;
48
49
	while (choice != QUIT) {
50
		choice = DoMenu();
51
52
		switch(choice) {
53
		case INFICINPOST:
54
			Init();
55
			scanf("%s", s);
56
			Infic_in_Post(s);
57
			break;
58
		case CALCULATOR:
59
            scanf("%s", s);
60
            calculator(s);
61
		default:
62
			break;
63
		}
64
	}
65
	return 0;
66
}
67
68
CHOICE DoMenu(void)
69
{
70
	CHOICE choice;
71
72
	printf(	"\nMenu\n"
73
			"\t%d quit\n"
74
			"\t%d infic->post\n"
75
			"\t%d calculator\n"
76
			"Enter new line: ",
77
			QUIT, INFICINPOST, CALCULATOR);
78
79
	scanf("%d", (int *)&choice);
80
81
	switch (choice) {
82
	case QUIT:
83
	case INFICINPOST:
84
	case CALCULATOR:
85
		return choice;
86
	default:
87
		return OTHER;
88
	}
89
	
90
	return OTHER;
91
}
92
93
94
int PriorityComp(char a, char b)
95
{
96
	switch (a) {
97
	case '(': case ')':
98
		a = 0;
99
		break;
100
	case '+': case '-':
101
		a = 1;
102
		break;
103
	case '*': case '/':
104
		a = 2;
105
		break;
106
	default:
107
		a = 3;
108
		break;
109
	}
110
	
111
	switch (b) {
112
	case '(': case ')':
113
		b = 0;
114
		break;
115
	case '+': case '-':
116
		b = 1;
117
		break;
118
	case '*': case '/':
119
		b = 2;
120
		break;
121
	default:
122
		b = 3;
123
		break;
124
	}
125
	
126
	return a - b;
127
}
128
129
void Infic_in_Post(char* s)
130
{	list_t *p;
131
	int j;
132
	unsigned int len = strlen(s);
133
	Init();
134
	
135
	for (unsigned int i = 0; i < len; i++) {
136
		std::cerr << i << ") " << s[i] << std::endl;
137
	
138
		if (s[i] >= '0' && s[i] <= '9') {
139
			printf("%c", s[i]);
140
			if (i == len - 1 || (i < len - 1 && (s[i + 1] < '0' || s[i + 1] > '9'))) printf(" ");
141
		}
142
		else if (s[i] == '(') {
143
			Push(s[i]);
144
		} else if (s[i] == ')') {
145
			while (!Empty() && head->data != '(')
146
				Pop();
147
			Pop();
148
		} else if (s[i]=='^') {
149
			Push(s[i]); j = i+1;
150
			while (j < len && s[j]<='9' && s[j]>='0') {
151
				printf("%c", s[j]); j++;}
152
			i = j - 1;
153
			Pop();
154
		} 
155
		else if (s[i]==' ')
156
			printf(" ");
157
		else {
158
			if (Empty()) Push(s[i]); 
159
			else {
160
				while (head!=NULL)
161
					if (PriorityComp(head->data, s[i]) >= 0) Pop(); else break;
162
				Push(s[i]);
163
			}
164
		}
165
				
166
		
167
		/*else if (s[i]=='+' || s[i]=='-') {
168
			Find('*','/');
169
			Find ('+', '-');
170
			Push (s[i]);
171
		} else if (s[i]=='*' || s[i]=='/') {
172
			Find ('*', '/');
173
			Push (s[i]);
174
		} */
175
		
176
	}
177
	while (!Empty()) Pop();
178-
	Del();
178+
179
180
int calculator(char* s)
181
{
182
	int j;
183
	unsigned int len = strlen(s);
184
	
185
	head->data=-1;
186
	head->next->data=-1;
187
	
188
	for (unsigned int i=0; i<len; i++) {
189
	    if (s[i]=='+') head->data=(int)head->data+(int)head->next->data;
190
        else if (s[i]=='-') head->data=(int)head->data-(int)head->next->data;
191
        else if (s[i]=='*') head->data=(int)head->data*(int)head->next->data;
192
        else if (s[i]=='/') head->data=(int)head->data/(int)head->next->data;
193
        else if (s[i]=='^') head->data=(int)head->data^(int)head->next->data;
194
        else if (s[i]<='9' && s[i]>='0') {
195
			j=i--;
196
	        if (s[j]==' ') {
197
				if (head->data!=(-1))
198
	                head->next->data=(int)s[i];
199
	            else head->data=(int)s[i];
200
	        } else if (head->next->data!=-1)
201
				head->data=head->data*10+(int)s[i];
202
			else
203
				head->next->data=head->next->data*10+(int)s[i];
204
		}
205
	}
206
	return head->data;
207
}
208
209
bool Empty(void)
210
{
211
	if (n == 0)
212
		return true;
213
	else
214
		return false;
215
}
216
217
void Push(char d)
218
{
219
	list_t *ins;
220
221
	ins = (list_t*)malloc(sizeof(list_t));
222
	ins->data = d;
223
	ins->prev = NULL;
224
225
	if (Empty()) {
226
		ins->next = NULL;
227
228
	} else {
229
		ins->next = head;
230
231
	}
232
	++n; head = ins;
233
}
234
235
void Pop()
236
{
237
	char d;
238
239
	if (head == NULL) return;
240-
	if (head == NULL)
240+
241
	if (n == 1) {
242
		d = head->data;
243
		free(head);
244
		head = NULL;
245-
		//free(head);
245+
246
			printf("%c ", d);
247
	} else {
248
		d = head->data;
249
		head = head->next;
250
		free(head->prev);
251
		head->prev = NULL;
252
		
253-
		//free(head->prev);
253+
254
			printf("%c ", d);
255
	}
256
	--n;
257
}
258
259
void Init(void)
260
{
261
	head = NULL;
262
	n = 0;
263
}
264
265
void Show(void)
266
{
267
	list_t *p;
268-
void Del(void)
268+
269
		fprintf(stderr, "Steck is empty!\n");
270-
	return;
270+
271
	}
272-
	if (n == 1)
272+
273-
		printf("%c", head->data);
273+
274
	printf("\n");
275-
	for (p = head->next; p != NULL; p = p->next)
275+
276-
		{printf("%c", p->prev->data);
276+
277-
		free(p->prev);}
277+
278
{
279
	list_t *p;
280
	p = head;
281
	while (p!=NULL)
282
	{
283
		if (p->data==a || p->data==b)
284
			printf("%c", p->data);
285
		p=p->next;
286
	}
287
}