Advertisement
Guest User

Untitled

a guest
May 24th, 2018
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.57 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <sstream>
  4. using namespace std;
  5.  
  6. template <class T>
  7. struct Node {
  8.     T data;
  9.     Node<T> *next = NULL;
  10. };
  11.  
  12. template <class T>
  13. struct Queue {
  14.     Node<T> *front = NULL;
  15.     Node<T> *rear = NULL;
  16.     int size = 0;
  17. };
  18.  
  19. template <class T>
  20. bool isEmpty(Queue<T> *q) {
  21.     return (q->size == 0);
  22. }
  23.  
  24. template <class T>
  25. void enqueue(Queue<T> *q, T newData) {
  26.     Node<T> *newNode = new Node<T>;
  27.     newNode->data = newData;
  28.     if (isEmpty(q)) {
  29.         q->front = newNode;
  30.     }
  31.     else q->rear->next = newNode;
  32.     q->rear = newNode;
  33.     q->size += 1;
  34.     return;
  35. }
  36.  
  37. template <class T>
  38. bool dequeue(Queue<T> *q, T &dataOut) {
  39.     if (isEmpty(q)) return false;
  40.     dataOut = q->front->data;
  41.     Node<T> *temp = q->front;
  42.     if (q->size == 1) q->rear = NULL;
  43.     q->front = temp->next;
  44.     q->size -= 1;
  45.     delete temp; temp = NULL;
  46.     return true;
  47. }
  48.  
  49. template <class T>
  50. void print(Queue<T> *q) {
  51.     if (isEmpty(q)) return;
  52.     Node<T> *temp = q->front;
  53.     while (temp != NULL) {
  54.         cout << temp->data << endl;
  55.         temp = temp->next;
  56.     }
  57.     cout << endl;
  58. }
  59.  
  60. template <class T>
  61. void freeMemory(Queue<T> *&q) {
  62.     Node<T> *temp = q->front;
  63.     while (temp != NULL) {
  64.         Node<T> *next = temp->next;
  65.         delete temp;
  66.         temp = next;
  67.     }
  68.     q->front = NULL;
  69.     q->rear = NULL;
  70.     q->size = 0;
  71. }
  72.  
  73. void expressionCalculate(string expression) {
  74.     reverse(expression.begin(), expression.end());
  75.     stringstream ss;
  76.     ss << expression;
  77.     Queue<string> *queue = new Queue<string>;
  78.     string str;
  79.     while (!ss.eof()) {
  80.         ss >> str;
  81.         if (str != "") enqueue(queue, str);
  82.         str.clear();
  83.     }
  84.     while (queue->size > 1) {
  85.         dequeue(queue, str);
  86.         if (str != "+" && str != "-" && str != "*" && str != "/") enqueue(queue, str);
  87.         else {
  88.             if ((queue->front->data == "+" || queue->front->data == "-" || queue->front->data == "*" || queue->front->data == "/")
  89.                 || (queue->front->next->data == "+" || queue->front->next->data == "-" || queue->front->next->data == "*" || queue->front->next->data == "/")) {
  90.                 enqueue(queue, str);
  91.             }
  92.             else {
  93.                 string str1;
  94.                 dequeue(queue, str1);
  95.                 double x = stod(str1);
  96.                 dequeue(queue, str1);
  97.                 double y = stod(str1);
  98.                 double z;
  99.                 if (str == "+") {
  100.                     z = x + y;
  101.                 }
  102.                 else if (str == "-") {
  103.                     z = y - x;
  104.                 }
  105.                 else if (str == "*") {
  106.                     z = x * y;
  107.                 }
  108.                 if (str == "/") {
  109.                     z = y / x;
  110.                 }
  111.                 str1 = to_string(z);
  112.                 enqueue(queue, str1);
  113.             }
  114.         }
  115.     }
  116.     dequeue(queue, str);
  117.     cout << str << endl;
  118.     delete queue;
  119.     queue = NULL;
  120. }
  121.  
  122. int main() {
  123.     expressionCalculate("6 3 / 1 -");
  124.     system("pause");
  125.     return 0;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement