Untitled

 avatar
unknown
plain_text
2 years ago
4.5 kB
5
Indexable
// Parastoo Toosi
// CS41 Data Structures
// Program 1 - using linked list
// Feb 11, 2023

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

class slList {
    public:
        double data;
        slList *prev;
        slList(double info) {
            data = info;
            prev = NULL;
        }
};

class Stack {
    private:
        slList *top; // pointing to top element 
    public:
        Stack() {
        top = NULL; 
        }
        
        void push(double info) {
            slList *temp = new slList(info);
            // temp is a pointer object of class slList
            // class_name object_name = new class_constructor;
            // temp->data = info, temp->prev = null
            
            temp->prev = top;
            top = temp;
        }
        
        void pop() {
            // sanitary check
            if (isEmpty()) {
                return;
            }
            slList *temp = top;
            top = top->prev;
            free(temp);
        }
        
        double topElement() {
            if(top == NULL)
                return -1;
            return top->data;
        }
        
        bool isEmpty() {
            // true if stack is empty else false
            if(top == NULL)
                return true;
            return false;
        }
};

bool isOperator(string word) {
    if (word == "+" || word == "-" || word == "*" || word == "/")
        return true;
    return false;
}

bool isEqualSign(string word) {
    if(word == "=")
        return true;
    return false;
}

// This function checks if word is an integer or a double value 
bool isOperand(string word) {
    // 2.3 2 4 5 
    int n = word.size(), i, ctr = 0;
    for(i=0;i<n;i++){
        if(word[i] < '0' && word[i] > '9')
            return false;
        if(word[i] == '.')
            ctr++; // ctr = ctr + 1
    }
    
    if(ctr == 0 || ctr == 1)
        return true;
    return false;
}

int main() {
    // infinite loop - we dont know how many inputs to take
    while(1){
        string str,word;
        cin >> str;
        cout << str << endl;
        if(str == "0")
            break;
        stringstream s(str);
        Stack stack;
        cout << str;
        while(s >> word) {
            cout << word << endl;
            // step 1: find if the word is operator or operand
            // step 2: if operand, then push word in stack
            // step 3: if operator (+ - * /), take first 2 elements of stack, calculate value, pop the 2 elements from stack, 
            // push the new value into the stack
            // step 4: if word == "=", then ans = top element of stack 
            // step 5: print the output 
            if (isOperator(word)) {
                double first, second; 
                if (stack.isEmpty()){
                    cout << "ERROR : Too many operators" << endl;
                    break;
                }
                second = stack.topElement();
                stack.pop();
                if (stack.isEmpty()){
                    cout << "ERROR : Too many operators" << endl;
                    break;
                }
                first = stack.topElement();
                stack.pop();
                
                double value;
                if (word == "+") {
                    value = first + second;
                } else if ( word == "-") {
                    value = first - second;
                } else if ( word == "*") {
                    value = first * second;
                } else {
                    if (second == 0) {
                        cout << "ERROR : Division by zero" << endl;
                        break;
                    }
                    value = first / second;
                }
                stack.push(value);
            }
            else if (isOperand(word)) {
               stack.push(stod(word)); // convert string to double and then push into stack
            }
            else if (isEqualSign(word)) {
                // if stack size is 1 
                double ans = stack.topElement();
                stack.pop();
                if (!stack.isEmpty()) {
                    cout << "ERROR : Too many operands" << endl;
                    break;
                } 
                cout << ans << endl;
            }
            else {
                // 2.3.4 5.5 +
                cout << "ERROR : Wrong input" <<endl;
            }
        }
    }
    return 0;
}
Editor is loading...