Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<math.h>
- using namespace std;
- struct stack
- {
- int data;
- stack* next;
- };
- stack *add(stack* &top, int element)
- {
- stack* q = new stack();
- q->data = element;
- q->next = top;
- top = q;
- return q;
- }
- stack* read_stack(stack*& top, int& data)
- {
- stack *q = top;
- data = top->data;
- top = top->next;
- delete q;
- return top;
- }
- int priority(char ch)
- {
- switch (ch)
- {
- case '(': case ')': return 0;
- case '+': case '-': return 1;
- case '*': case '/': return 2;
- case '^': return 3;
- default: return -1;
- }
- }
- void PostFix(char* str_in, char* str_out)
- {
- stack* top = NULL;
- int k = 0;
- int data;
- for (int i = 0; i < strlen(str_in); i++)
- {
- if (str_in[i] > 'A' && str_in[i]!='^')
- // ^ - в таблице ascii дальше чем алфавит A-Z
- {
- str_out[k++] = str_in[i];
- continue;
- }
- if (top == NULL || str_in[i] == '(')
- {
- add(top, str_in[i]);
- continue;
- }
- if (str_in[i] == ')')
- {
- while (top->data != '(')
- {
- read_stack(top, data);
- str_out[k++] = data;
- }
- read_stack(top, data);//удаляем '('
- continue;
- }
- while (top != NULL && priority(str_in[i]) <= priority(top->data))
- {
- read_stack(top, data);
- str_out[k++] = data;
- }
- add(top, str_in[i]);
- }
- while (top != NULL)
- {
- top = read_stack(top, data);
- str_out[k++] = data;
- }
- str_out[k] = '\0';
- }
- int result(char* str_out,int *mass)
- {
- stack* top = NULL;
- int k = 0;
- int data;
- int inf1;
- int inf2;
- for (int i = 0; i < strlen(str_out); i++)
- {
- if (str_out[i] > 'A' && str_out[i]!='^')
- {
- add(top, mass[str_out[i]]);
- continue;
- }
- //если знак операции
- read_stack(top, inf2);
- read_stack(top, inf1);
- switch (str_out[i])
- {
- case '+': add(top, inf1 + inf2); break;
- case '-': add(top, inf1 - inf2); break;
- case '*': add(top, inf1 * inf2); break;
- case '/':
- if (inf2 == 0)
- {
- cout << "деление на ноль" << endl;
- system("pause");
- return 1;
- }
- add(top, inf1 / inf2); break;
- case '^': add(top, pow(inf1, inf2)); break;
- }
- }
- read_stack(top, data); //вывод ответа/что осталось в стеке
- return data;
- }
- int errors(char* str)
- {
- stack* top = NULL;
- stack* q;
- if (strlen(str) == 1)
- {
- cout << "ввел один символ" << endl;
- return 0;
- }
- if (isalpha(str[0]) || str[0] == '(')
- {
- for (unsigned int i = 0; i < strlen(str); i++)
- {
- if (!isalpha(str[i]) && str[i] != '(' && str[i] != ')' && str[i] != '*' && str[i] != '-' && str[i] != '+' && str[i] != '^' && str[i] != '/')
- {
- cout << "введенный символ не является латиницей или знаками операций." << endl;
- return -1;
- }
- if (str[i] == '(')
- {
- top = add(top, str[i]);
- continue;
- }
- if (isalpha(str[i]) && str[i + 1] == '(')
- {
- cout << "за переменной не последовал знак вычисления" << endl;
- return -1;
- }
- if ((str[i] == '*' || str[i] == '-' || str[i] == '+' || str[i] == '^' || str[i] == '/' || str[i] == '(') && !isalpha(str[i + 1]) && str[i + 1] != '(')
- // ошибка, если после ( сразу идет знак операции
- {
- cout << "после знака операции последовало что-то странное" << endl;
- return -1;
- }
- if (str[i] == ')')
- {
- if (isalpha(str[i + 1]) || top == NULL)
- {
- cout << "стек пуст или после скобочки ты ввел переменную или колво открытых не соотвутсвует колву закрытых скобочек" << endl;
- return -1;
- }
- q = top;
- top = top->next;
- delete q;
- continue;
- }
- if (isalpha(str[i]) && isalpha(str[i + 1]))
- {
- cout << "за переменной следовала переменная" << endl;
- return -1;
- }
- if (isdigit(str[i]))
- {
- cout << "введена цифра а не символ" << endl;
- return -1;
- }
- }
- if (top != NULL)
- {
- while (top != NULL)
- {
- q = top;
- top = top->next;
- delete q;
- }
- cout << "стек не пуст, мб кол-во скобочек нарушено" << endl;
- return -1;
- }
- }
- else
- {
- cout << "первый символ знак операции или число" << endl;
- return -1;
- }
- return 1;
- }
- void vvod(char* str, int* mass)
- {
- double m[50];
- int n = 0, k = 0;
- for (int i = 0; i < strlen(str); i++)
- {
- n = 0;
- for (int j = 0; j < k; j++)
- if (m[j] ==(str[i])) // счетчик повторено вводимых
- n++;
- if (isalpha(str[i]) && n == 0) // если повторений нет выполняем ввод
- {
- cout << "ведите значение для переменной " << str[i] << " = ";
- cin >> mass[(str[i])];
- m[k] = (str[i]);
- k++;
- }
- }
- }
- int main()
- {
- setlocale(LC_ALL, "ru");
- char str_in[20];
- cout << " Vvedite viragenie " << endl;
- cin.getline(str_in, 20);
- char str_out[20];
- int mass[150];
- if (errors(str_in) == 1)
- {
- vvod(str_in, mass);
- PostFix(str_in, str_out);
- cout << "Post_form:" << str_out;
- cout << endl << "Result " << result(str_out, mass);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement