Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #define MAXVAL 1000
- #define Number '0'
- int sp = 0;
- int i = 0;
- int last = 0;
- int k = 0;
- char val[MAXVAL];
- char array[MAXVAL];
- char pop(void) {
- if (sp > 0) {
- sp--;
- return val[sp];
- }
- else {
- return -1;
- }
- }
- void push(char f) {
- last = (f == '(') ? 0 : last;
- if (f == '*' || f == '/') {
- if (last == 2) {
- array[k] = pop();
- k++;
- array[k] = ' ';
- k++;
- }
- last = 2;
- }
- if (f == '+' || f == '-') {
- if (last != 0) {
- array[k] = pop();
- k++;
- array[k] = ' ';
- k++;
- }
- last = 1;
- }
- if (sp < MAXVAL) {
- val[sp] = f;
- sp++;
- }
- else {
- printf("стек переполнен");
- }
- }
- char type(char b) {
- return ((int)b >= 48 && (int)b <= 57) ? Number : b;
- }
- int main(void) {
- int j,count=0;
- int fin[MAXVAL];
- char in[2*MAXVAL];
- gets(in);
- long int N = strlen(in);
- if (N == 0) {
- printf("syntax error");
- return 0;
- }
- for (i = 0;i < N;i++) {
- if (type(in[i]) != Number && type(in[i - 1]) == Number && i>0) {
- array[k] = ' ';
- k++;
- }
- if ((type(in[N - 1]) != Number && in[N - 1]!='(' && in[N - 1]!=')') || (type(in[N-1])!=Number && type(in[N-2])!=Number && in[N-2]!=')')|| in[N - 1] == '(') {
- printf("syntax error");
- return 0;
- }
- if ((type(in[i]) != Number && in[i] != '(' && in[i] != ')') && (type(in[i - 1]) != Number && in[i-1] != '(' && in[i-1] != ')') && i > 0) {
- printf("syntax error");
- return 0;
- }
- switch (type(in[i]))
- {
- case Number:
- array[k] = in[i];
- k++;
- break;
- case '(':
- push(in[i]);
- count++;
- break;
- case '*':
- push(in[i]);
- break;
- case '/':
- push(in[i]);
- break;
- case '-':
- push(in[i]);
- break;
- case '+':
- push(in[i]);
- break;
- case ')':
- count--;
- if (in[i - 1] == '(') {
- printf("syntax error");
- return 0;
- }
- while (1) {
- array[k] = pop();
- if (array[k] == '(') {
- push(pop());
- break;
- }
- k++;
- array[k] = ' ';
- k++;
- }
- break;
- default:
- printf("syntax error");
- return 0;
- break;
- }
- }
- if (count !=0) {
- printf("syntax error");
- return 0;
- }
- int counter = 0;
- for (j = 0;j < k;j++) {
- in[j] = array[j];
- counter++;
- }
- for (j = sp - 1;j >= 0;j--) {
- in[counter] = ' ';
- counter++;
- in[counter] = val[j];
- counter++;
- }
- int counter1 = 0;
- long int summ = 0;
- for (i = 0;i < counter;i++) {
- //printf("%c", in[i]);
- if (type(in[i]) == Number) {
- summ = (summ * 10) + (int)in[i] % 48;
- continue;
- }
- else {
- if (in[i] == ' ' && type(in[i - 1]) == Number) {
- fin[counter1] = summ;
- summ = 0;
- counter1++;
- continue;
- }
- }
- switch (type(in[i]))
- {
- case '+':
- fin[counter1 - 2] = fin[counter1 - 1] + fin[counter1 - 2];
- counter1 = counter1 - 1;
- break;
- case '-':
- fin[counter1 - 2] = fin[counter1 - 2] - fin[counter1 - 1];
- counter1 = counter1 - 1;
- break;
- case '*':
- fin[counter1 - 2] = fin[counter1 - 1] * fin[counter1 - 2];
- counter1 = counter1 - 1;
- break;
- case '/':
- if (fin[counter1 - 1] == 0) {
- printf("division by zero");
- return 0;
- }
- fin[counter1 - 2] = fin[counter1 - 2] / fin[counter1 - 1];
- counter1 = counter1 - 1;
- break;
- }
- }
- if (fin[0] ==-858993460) {
- fin[0] = summ;
- }
- printf("%d", fin[0]);
- getchar();
- getchar();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement