Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <sstream>
- using namespace std;
- template <class T>
- struct Node {
- T data;
- Node<T> *next = NULL;
- };
- template <class T>
- struct Queue {
- Node<T> *front = NULL;
- Node<T> *rear = NULL;
- int size = 0;
- };
- template <class T>
- bool isEmpty(Queue<T> *q) {
- return (q->size == 0);
- }
- template <class T>
- void enqueue(Queue<T> *q, T newData) {
- Node<T> *newNode = new Node<T>;
- newNode->data = newData;
- if (isEmpty(q)) {
- q->front = newNode;
- }
- else q->rear->next = newNode;
- q->rear = newNode;
- q->size += 1;
- return;
- }
- template <class T>
- bool dequeue(Queue<T> *q, T &dataOut) {
- if (isEmpty(q)) return false;
- dataOut = q->front->data;
- Node<T> *temp = q->front;
- if (q->size == 1) q->rear = NULL;
- q->front = temp->next;
- q->size -= 1;
- delete temp; temp = NULL;
- return true;
- }
- template <class T>
- void print(Queue<T> *q) {
- if (isEmpty(q)) return;
- Node<T> *temp = q->front;
- while (temp != NULL) {
- cout << temp->data << endl;
- temp = temp->next;
- }
- cout << endl;
- }
- template <class T>
- void freeMemory(Queue<T> *&q) {
- Node<T> *temp = q->front;
- while (temp != NULL) {
- Node<T> *next = temp->next;
- delete temp;
- temp = next;
- }
- q->front = NULL;
- q->rear = NULL;
- q->size = 0;
- }
- void expressionCalculate(string expression) {
- reverse(expression.begin(), expression.end());
- stringstream ss;
- ss << expression;
- Queue<string> *queue = new Queue<string>;
- string str;
- while (!ss.eof()) {
- ss >> str;
- if (str != "") enqueue(queue, str);
- str.clear();
- }
- while (queue->size > 1) {
- dequeue(queue, str);
- if (str != "+" && str != "-" && str != "*" && str != "/") enqueue(queue, str);
- else {
- if ((queue->front->data == "+" || queue->front->data == "-" || queue->front->data == "*" || queue->front->data == "/")
- || (queue->front->next->data == "+" || queue->front->next->data == "-" || queue->front->next->data == "*" || queue->front->next->data == "/")) {
- enqueue(queue, str);
- }
- else {
- string str1;
- dequeue(queue, str1);
- double x = stod(str1);
- dequeue(queue, str1);
- double y = stod(str1);
- double z;
- if (str == "+") {
- z = x + y;
- }
- else if (str == "-") {
- z = y - x;
- }
- else if (str == "*") {
- z = x * y;
- }
- if (str == "/") {
- z = y / x;
- }
- str1 = to_string(z);
- enqueue(queue, str1);
- }
- }
- }
- dequeue(queue, str);
- cout << str << endl;
- delete queue;
- queue = NULL;
- }
- int main() {
- expressionCalculate("6 3 / 1 -");
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement