Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <stack>
- #include <string>
- using namespace std;
- int prior(char x) {//приоритет
- int i;
- switch (x)
- {
- case '(': i = 0; break;
- case ')': i = 1; break;
- case '+': i = 2; break;
- case '-': i = 2; break;
- case '*': i = 3; break;
- case '/': i = 3; break;
- case '^': i = 4; break;
- }
- return i;
- }
- int main() {
- string s;
- stack <char> steck;
- cin >> s;
- string st;
- int c = s.length(), i;
- for (i = 0; i < c; i++)//перебор строки
- {
- if (s[i] == '(' || s[i] == ')') {//скобки
- if (s[i] == ')') {//закрывающая скобка
- st += ' ';
- do {
- st += steck.top();//перенос всех символов
- st += ' ';
- steck.pop();//удаление открывающей скобки
- } while (steck.top() != '(');
- steck.pop();
- }
- else
- steck.push(s[i]);
- }
- else if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' || s[i] == '^') { //операции
- if (steck.empty() || prior(s[i]) > prior(steck.top()))//стек пуст или вершина имеет приоритет ниже
- {
- steck.push(s[i]);//добавляем элемент в стек
- st += ' ';//разделение чисел
- }
- else {// вершина с высоким приоритетом
- while (!steck.empty() && prior(s[i]) <= prior(steck.top()))// переносим элементы из стека в строку, пока условие не изменится
- {
- st += ' ';
- st += steck.top();
- st += ' ';
- steck.pop();
- }
- steck.push(s[i]);
- }
- }
- else {
- st += s[i];
- }
- }
- while (!steck.empty()) {
- st += steck.top();
- st += ' ';
- steck.pop();
- }
- cout << "ОПЗ: " << st;
- stack <string> stack2;
- int x1, x2, x3;
- string l1, l2 = "";
- c = st.length();
- for (i = 0; i < c; i++)//перебор строки
- {
- if (st[i] == '+' || st[i] == '-' || st[i] == '*' || st[i] == '/' || st[i] == '^')
- { //операции над числами
- x1 = stoi(stack2.top());
- stack2.pop();
- x2 = stoi(stack2.top());
- stack2.pop();
- switch (st[i])
- {
- case '+': x3 = x2 + x1; break;
- case '-': x3 = x2 - x1; break;
- case '*': x3 = x2 * x1; break;
- case '/': x3 = x2 / x1; break;
- case '^': x3 = x2 ^ x1; break;
- }
- l1 = to_string(x3);
- stack2.push(l1);
- }
- else {
- if (st[i] == ' ')
- {
- if (l2.length())
- {
- stack2.push(l2);
- l2 = "";
- }
- }
- else
- {
- l2 += st[i];
- }
- }
- }
- cout << " = " << stack2.top();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement