Advertisement
Artem_Chepurov

OPZ

Feb 29th, 2020
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.45 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. /*#include <iostream>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. struct stackNode {
  7.     int data;
  8.     struct stackNode* nextPtr;
  9. };
  10.  
  11. typedef struct stackNode StackNode;
  12. typedef StackNode* StackNodePtr;
  13.  
  14. void push(StackNodePtr*, int);
  15. int pop(StackNodePtr*);
  16. int isEmpty(StackNodePtr);
  17. void printStack(StackNodePtr);
  18. void instructions(void);
  19.  
  20. int main()
  21. {
  22.     StackNodePtr stackPtr = NULL;
  23.     int choice, value;
  24.     instructions();
  25.     printf("? ");
  26.     scanf("%d", &choice);
  27.  
  28.     while (choice != 3) {
  29.  
  30.         switch (choice) {
  31.         case 1: //затолкнуть значение в стек
  32.             printf("Enter an integer: ");
  33.             scanf("%d", &value);
  34.             push(&stackPtr, value);
  35.             printStack(stackPtr);
  36.             break;
  37.         case 2: //вытолкнуть значение из стека
  38.             if (!isEmpty(stackPtr))
  39.                 printf("The popped value is %d.\n", pop(&stackPtr));
  40.             printStack(stackPtr);
  41.             break;
  42.         default:
  43.             printf("invalid choice. \n\n");
  44.             instructions();
  45.             break;
  46.         }
  47.  
  48.         printf("? ");
  49.         scanf("%d", &choice);
  50.     }
  51.  
  52.     printf("End of run.\n");
  53.     return 0;
  54. }
  55.  
  56. //вывести инструкцию
  57. void instructions(void) {
  58.     printf("Enter choice:\n"
  59.         "1 to push a value off the stack\n"
  60.         "2 to pop a value of the stack\n"
  61.         "3 to end prorham\n");
  62. }
  63.  
  64. //вставить значение на вершине стека
  65.  
  66. void push(StackNodePtr* topPtr, int info) {
  67.     StackNodePtr newPtr;
  68.  
  69.     newPtr = (StackNode*)malloc(sizeof(StackNode));
  70.     if (newPtr != NULL) {
  71.         newPtr->data = info;
  72.         newPtr->nextPtr = *topPtr;
  73.         *topPtr = newPtr;
  74.     }
  75.     else
  76.         printf("%d not inserted. No memory available.\n", info);
  77. }
  78.  
  79. //удалить узел на вершине стека
  80.  
  81. int pop(StackNodePtr* topPtr) {
  82.     StackNodePtr tempPtr;
  83.     int popValue;
  84.  
  85.     tempPtr = *topPtr;
  86.     popValue = (*topPtr)->data;
  87.     *topPtr = (*topPtr)->nextPtr;
  88.     free(tempPtr);
  89.     return popValue;
  90. }
  91. //распечатать стек
  92. void printStack(StackNodePtr currentPtr) {
  93.     if (currentPtr == NULL)
  94.         printf("The stack is empty.\n\n");
  95.     else {
  96.         printf("The stack is:\n");
  97.  
  98.         while (currentPtr != NULL) {
  99.             printf("%d --> ", currentPtr->data);
  100.             currentPtr = currentPtr->nextPtr;
  101.         }
  102.  
  103.         printf("NULL\n\n");
  104.     }
  105. }
  106. //стек пуст
  107. int isEmpty(StackNodePtr topPtr) {
  108.     return topPtr == NULL;
  109. }*/
  110.  
  111. #include <iostream>
  112. #include <string>
  113. using namespace std;
  114. const int n = 20;
  115. /*
  116. //НАША СТРУКТУРА
  117. struct List
  118. {
  119.     char x;                                              //информационный элемент
  120.     List* Next, * Head;                                   //Голова стека и указатель на следующий элемент
  121. };
  122.  
  123. //ФУНКЦИЯ ДОБАВЛЕНИЯ ЭЛЕМЕНТА В СТЕК (в список LIFO)
  124. void push(char x, List*& MyList)                          //Принимаем элемент стека и указатель на стек, при этом говорим, что принимаемый указатель будет сам по себе указателем
  125. {
  126.     List* temp = new List;                              //Выделяем память для нового элемента
  127.     temp->x = x;                                        //Записываем в поле x принимаемый в функцию элемент x
  128.     temp->Next = MyList->Head;                          //Указываем, что следующий элемент это предыдущий
  129.     MyList->Head = temp;                                //Сдвигаем голову на позицию вперед
  130. }
  131.  
  132. void pop(List*& MyList)
  133. {
  134.     int temp = Next->x;                 // извлекаем в переменную temp значение в вершине стека
  135.     List* MyStack = Next;                   // запоминаем указатель на вершину стека, чтобы затем
  136.                                             // освободить выделенную под него память
  137.     Next = Next->Next;                      // вершиной становится предшествующий top элемент
  138.     delete MyStack;                         // освобождаем память, тем самым удалили вершину
  139.     std::cout << temp;                      //Вывод текущего элемента на экран
  140. }
  141.  
  142. //ФУНКЦИЯ ОТОБРАЖЕНИЯ СТЕКА
  143. void Show(List* MyList)                                 //Нужен только сам стек
  144. {
  145.     List* temp = MyList->Head;                          //Объявляем указатель и Указываем ему, что его позиция в голове стека
  146.     //с помощью цикла проходим по всему стеку
  147.     while (temp != NULL)                                //выходим при встрече с пустым полем
  148.     {
  149.         cout << temp->x << " ";                         //Выводим на экран элемент стека
  150.         temp = temp->Next;                              //Переходим к следующему элементу
  151.     }
  152. }
  153.  
  154. //ФУНКЦИЯ УДАЛЕНИЯ СТЕКА ИЗ ПАМЯТИ
  155. void ClearList(List* MyList)
  156. {
  157.     while (MyList->Head != NULL)                        //Пока по адресу не пусто
  158.     {
  159.         List* temp = MyList->Head->Next;                    //Временная переменная для хранения адреса следующего элемента
  160.         delete MyList->Head;                                //Освобождаем адрес обозначающий начало
  161.         MyList->Head = temp;                                //Меняем адрес на следующий
  162.     }
  163. }
  164.  
  165. int main()
  166. {
  167.     List* MyList = new List; //Выделяем память для стека
  168.  
  169.  
  170.     MyList->Head = NULL; //Во избежание ошибок инициализируем первый элемент
  171.  
  172.    
  173.     char flag = 'a';
  174.     while (flag != '0') {
  175.         cin >> flag;
  176.         push(flag, MyList);
  177.     }
  178.  
  179.     pop(MyList);
  180.     pop(MyList);
  181.     pop(MyList);
  182.  
  183.     Show(MyList); //Выводим стек на экран
  184.  
  185.     ClearList(MyList); //Очищаем память.
  186.     delete MyList->Head;
  187.     delete MyList;
  188. } */
  189.  
  190. /*
  191. int main()
  192. {
  193.     stek* p = 0;
  194.     int voice = 10;
  195.     char str[10];
  196.     char out[10];
  197.     int j = 0;
  198.     scanf("%s", str);
  199.     int len = strlen(str);
  200.     for (int i = 0; i < len; i++)
  201.         if (str[i] > '0' && str[i] <= '9') {
  202.             out[j] = str[i];
  203.             j++;
  204.         }
  205.         else switch (str[i]) {
  206.         case '+':   push(p, str[i]); break;
  207.         case '-':   push(p, str[i]); break;
  208.         case '*':   push(p, str[i]); break;
  209.         case '/':   push(p, str[i]); break;
  210.         default:
  211.             cout << "undefined operatop " << str[i] << endl;
  212.             return 0;
  213.  
  214.         }
  215.  
  216.  
  217.  
  218.     char ch;
  219.     while (voice!=0)
  220.     {
  221.         printf("Input char\n");
  222.         //scanf("%c", &ch);
  223.         //std::cin >> ch;
  224.          ch = getchar();
  225.         push(p, ch);
  226.         voice--;
  227.     }                               //вывели на экран текущий элемент стека = 100
  228.     voice = 10;
  229.     while (voice != 0) {
  230.         pop(p);
  231.         voice--;
  232.     }
  233.     return 0;
  234. }*/
  235. struct stek
  236. {
  237.     char value;
  238.     struct stek* next;                      // указатель на следующий элемент списка (стека)
  239. };
  240.  
  241. bool empty(stek*& NEXT)
  242. {
  243.     if (NEXT == NULL) {
  244.     //  std::cout << "Empty\n";
  245.         return true;
  246.     }
  247.     return false;
  248. }
  249.  
  250. void push(stek*& NEXT, char VALUE)
  251. {
  252.     stek* MyStack = new stek;               // объявляем новую динамическую переменную типа stek
  253.     MyStack->value = VALUE;                 // записываем значение, которое помещается в стек
  254.     MyStack->next = NEXT;                   // связываем новый элемент стека с предыдущим
  255.     NEXT = MyStack;                         // новый элемент стека становится его вершиной
  256. }
  257. // извлекаем и возвращаем верхний элемент из стека
  258. char pop(stek*& NEXT)
  259. {
  260.     if (empty(NEXT))
  261.         return -1;
  262.     char temp = NEXT->value;                 // извлекаем в переменную temp значение в вершине стека
  263.     stek* MyStack = NEXT;                   // запоминаем указатель на вершину стека, чтобы затем
  264.                                             // освободить выделенную под него память
  265.     NEXT = NEXT->next;                      // вершиной становится предшествующий top элемент
  266.     delete MyStack;                         // освобождаем память, тем самым удалили вершину
  267.     //std::cout << temp;                      //Вывод текущего элемента на экран
  268.     return temp;                            // возвращаем значение, которое было в вершине
  269. }
  270.  
  271. //возвращает верхний элемент стека
  272. char top(stek*& NEXT)
  273. {
  274.     char temp = NEXT->value;                 // извлекаем в переменную temp значение в вершине стека
  275.     return temp;                             //возвращаем значение, которое было на вершине
  276. }
  277. inline int prior(char c) {
  278.     switch (c) {
  279.     case '(': return 1;
  280.     case '+': case '-': return 2;
  281.     case '*': case '/': return 3;
  282.     default: return 0;
  283.     }
  284. }
  285.  
  286. void input(char a[]) {
  287.     for (int i = 0; i < n; i++) {           //считываем инфиксную запись до "="
  288.         cin >> a[i];
  289.         if (a[i] == '=') {
  290.             break;
  291.         }
  292.     }
  293. }
  294.  
  295. int strlen1(char a[]) {
  296.     int i = n - 1;
  297.     while (a[i] > 0 && !a[i])
  298.         i--;
  299.     return i;
  300.  
  301. }
  302.  
  303. void inopz(char infix[],char postfix[], stek *&p) {
  304.     int j = 0;
  305.     int k = 0;
  306.     while (infix[j] != '=') {
  307.         if ((infix[j] >= 'A' && infix[j] <= 'Z') || (infix[j] >= 'a' && infix[j] <= 'z') || (infix[j] >= '0' && infix[j] <= '9')) {
  308.             postfix[k] = infix[j];
  309.             k++;
  310.         }
  311.         if (infix[j] == '+' || infix[j] == '-' || infix[j] == '*' || infix[j] == '/') {
  312.             if (empty(p) || prior(infix[j]) > prior(p->value))
  313.                 push(p, infix[j]);
  314.             else
  315.             {
  316.                 while (!empty(p) && prior(infix[j]) <= prior(top(p))) {
  317.                     postfix[k] = pop(p);
  318.                     k++;
  319.                 }
  320.                 if (empty(p) || prior(infix[j]) > prior(p->value))
  321.                     push(p, infix[j]);
  322.             }
  323.         }
  324.         if (infix[j] == '(')
  325.             push(p, infix[j]);
  326.         if (infix[j] == ')') {
  327.             while (top(p) != '(') {
  328.                 postfix[k] = pop(p);
  329.                 k++;
  330.             }
  331.             pop(p);
  332.         }
  333.         j++;
  334.     }
  335.     if (!empty(p))
  336.         while (!empty(p)) {
  337.             postfix[k] = pop(p);
  338.             k++;
  339.         }for (int i = 0; i < k; i++)
  340.             cout << postfix[i];
  341. }
  342.  
  343. int calculate(char post[], stek*& p) {
  344.     int n1, n2, res;
  345.     cout <<endl<<  strlen1(post)<< endl;
  346.     int size = strlen(post);
  347.     for (int i = 0; i < size; ++i) {
  348.         if ((post[i] >= 'A' && post[i] <= 'Z') || (post[i] >= 'a' && post[i] <= 'z') || (post[i] >= '0' && post[i] <= '9')) {
  349.             push(p, post[i]);
  350.         }
  351.         else {
  352.             n2 = pop(p);
  353.             n1 = pop(p);
  354.             switch (post[i]) {
  355.             case '+': res = n1 + n2; break;
  356.             case '-': res = n1 - n2; break;
  357.             case '*': res = n1 * n2; break;
  358.             case '/': res = n1 / n2; break;
  359.             default: cout << "ERORR !\n";
  360.             }
  361.             push(p, res);
  362.         }
  363.     }
  364.     return pop(p);
  365. }
  366. int main()
  367. {
  368.     stek* p = 0;                            //создаем стек
  369.     char infix[n];                          //масив инфиксной записи   
  370.     char postfix[n];                        //массив постфиксной записи
  371.     input(infix);
  372.     inopz(infix, postfix, p);
  373.     cout << endl << strlen1(postfix) << endl;
  374.     cout << calculate(postfix, p);
  375.    
  376.     return 0;
  377. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement