Untitled

 avatar
unknown
plain_text
a month ago
10 kB
1
Indexable
#include <iostream>
#include "main.h"

using namespace std;

struct Node
{
    int data;
    Node* next;
    Node* start;
};

void push(Node* &stack, int data)
{
    Node* newnode = new Node;
    //std::cout << "Test " << data << endl;
    newnode->data = data;
    //std::cout << "Push " << data << endl;
    if (stack != nullptr)
    {
        newnode->next = stack;
        newnode->start = stack->start;
        stack = newnode;
    }
    else
    {
        //std::cout << "pierwszy element\n";
        stack = newnode;
        stack->start = stack;
        stack->next = nullptr;
    }
    //newnode->next = stack;
    //std::cout << "push " << endl;
}
void pop(Node* &stack)
{
    if (stack != nullptr && stack->next != nullptr)
    {
        //std::cout << "Popping " << stack->data << endl;
        Node* prev = stack;
        stack = stack->next;
        delete prev;
    }
    else if (stack != nullptr && stack->next == nullptr) // ostatni element
    {
        //std::cout << "Popping last element: " << stack->data << endl;
        delete stack;
        stack = nullptr;
    }
    else
    {
        std::cout << "Nothing to pop, stack is empty " << endl;
    }
}
int topEl(Node* stack)
{
    return stack->data;
}
bool isEmpty(Node* stack)
{
    if (stack == nullptr)
    {
        return true;
    }
    return false;
}

int getStackSize(Node* stack)
{
    //std::cout << "getStackSize" << endl;
    int stacksize = 0;
    Node* counter = stack;
    while (counter != nullptr)
    {
        stacksize++;
        //std::cout << "Counter: " << counter->data << endl;
        counter = counter->next;
    }
    return stacksize;
}
int test = 0;

void printStack(Node* stack)
{
    if (stack != nullptr)
    {
        std::cout << "printStack stack->data: " << stack->data << endl;
        //std::cout << "printStack stack->start: " << stack->start << endl;
        test++;
        /*if (test > 10)
        {
            test = 0;
            return;
        }*/
        if (stack->next != nullptr)
        {
            printStack(stack->next);
        }
    }
}

void printStack2(Node* stack)
{
    if (stack != nullptr)
    {
        std::cout << char(stack->data);
        //std::cout << "printStack stack->start: " << stack->start << endl;
        test++;
        /*if (test > 10)
        {
            test = 0;
            return;
        }*/
        if (stack->next != nullptr)
        {
            printStack2(stack->next);
        }
    }
}

void reverse(Node* &stack)
{
    std::cout << "Reversing stack" << endl;
    Node* newstack = nullptr;
    while (stack != nullptr)
    {
        push(newstack, topEl(stack));
        pop(stack);
    }
    stack = newstack;
    newstack = nullptr;
    delete newstack;
}

void UpdateStart(Node* stack)
{
    if (stack->next == nullptr)
    {
        return;
    }
    else
    {
        stack->next->start = stack->start;
        UpdateStart(stack->next);
    }
}

Node* merge(Node* A, Node* B)
{
    std::cout << "Merging stacks" << endl;
    B->start->next = A;
    UpdateStart(B);
    delete A;
    return B;
}

Node* CreateStack()
{
    Node* stack = new Node;
    stack->start = stack;
    stack->next = nullptr;
    return stack;
}

void Sort(Node*& stack)
{
    Node* pomocniczy = nullptr;

    while (stack != nullptr)
    {
        printStack(pomocniczy);

        // pobieramy gore, sciagamy z oryginalnego stosu
        int gora = topEl(stack);
        std::cout << "Pobrana gora: " << gora << endl;
        pop(stack);

        // sciagamy ze stosu pomocniczego wszystko to, co jest mniejsze niz pobrany element, wrzucamy na stos oryginalny
        while (pomocniczy != nullptr && pomocniczy->data < gora)
        {
            int gora_p = topEl(pomocniczy);
            pop(pomocniczy);
            push(stack, gora_p);
        }

        printStack(pomocniczy);

        // stos pomocnicy - wrzucamy wybrany element
        push(pomocniczy, gora);

        // z powrotem wrzucamy na stos pomocniczy to co wrzucilismy do oryginalnego
        while (stack != nullptr && stack->data <= pomocniczy->data)
        {
            int gora_g = topEl(stack);
            pop(stack);
            push(pomocniczy, gora_g);
        }

        printStack(stack);
        printStack(pomocniczy);

    }

    delete stack;
    stack = pomocniczy;
    delete pomocniczy;
}

void printAsMermaidGraph(Node* stack)
{
    std::cout << "graph LR;" << endl;
    Node* iter = stack;
    //string l2 = ""
    int counter = 1;
    std::cout << "stos:::nonnode-.->";
    while (iter != nullptr)
    {
        std::cout << "id" << counter << "[" << iter->data << "]:::node-->";
        iter = iter->next;
        counter++;
    }
    std::cout << "nullptr:::nonnode;" << endl;
    std::cout << "classDef node fill:#fff,stroke:#333,color:#333" << endl;
    std::cout << "classDef nonnode fill:#fff,stroke:#fff,color:#A3303B" << endl;
    // Uzupe³nij kod tutaj.
}

int sila(char c)
{
    if (c == '^')
    {
        return 3;
    }
    else if (c == '/' || c == '*')
        return 2;
    else if (c == '+' || c == '-')
        return 1;
    else
        return -1;
}

bool is_operand(char c)
{
    if (c == '/' || c == '*' || c == '^' || c == '+' || c == '-' || c == '(' || c == ')')
    {
        return false;
    }
    return true;
}

std::string infixtopostfix(std::string infix)
{
    Node* stos = nullptr;
    std::string postfix = "";

    std::cout << "INFIXTOPOSTFIX" << endl;

    for (char currentchar : infix)
    {
        std::cout << currentchar << " " << endl;
        std::cout << "Stos: ";
        printStack2(stos);
        std::cout << endl;

        // Je¿eli operand
        if (is_operand(currentchar))
        {
            postfix += currentchar;
            //std::cout << postfix << " is the postfix" << endl;
        }
        else if (currentchar == '(')
        {
            push(stos, currentchar);
        }
        else if (currentchar == ')')
        {
            while (stos != nullptr && topEl(stos) != '(')
            {
                postfix += topEl(stos);
                pop(stos);
            }
            if (stos != nullptr && topEl(stos) == '(')
                pop(stos); // Remove '('
        }
        else // Je¿eli nie operand
        {
            int currentsila = sila(currentchar); // Je¿eli na stosie jest mniejsza sila, stos to ( albo stos jest pusty:
            if (stos == nullptr || sila(topEl(stos)) < currentsila || topEl(stos) == '(')
            {
                push(stos, currentchar);
            }

            else
            {
                while(stos != nullptr && sila(topEl(stos)) >= currentsila)
                {
                    char topel = topEl(stos);
                    //std::cout << "??? :---- " << topel << endl;
                    if (topel != ')' && topel != '(')
                    {
                        postfix += topel;
                    }
                    pop(stos);
                }
                push(stos, currentchar);

            }
        }
        // wrzucamy co zostalo na stosie
    }

    while (stos != nullptr)
    {
        if (topEl(stos) != '(' && topEl(stos) != ')')
        {
            postfix += topEl(stos);
        }
        pop(stos);
    }

    return postfix;
}

int main()
{
    // Testing push, pop, topel, size
    std::cout << "----TEST1----" << endl;
    Node* stack = nullptr;
    cout << "Empty: " << isEmpty(stack) << endl;
    push(stack, 1);
    push(stack, 2);
    push(stack, 3);
    push(stack, 4);
    pop(stack);
    push(stack, 8);
    printStack(stack);
    cout << "Size: " << getStackSize(stack) << endl;
    cout << "TOPEL: " << topEl(stack) << endl;
    pop(stack);
    cout << "TOPEL: " << topEl(stack) << endl;
    pop(stack);
    pop(stack);
    pop(stack);
    pop(stack);
    pop(stack);
    pop(stack);
    pop(stack);
    //pop(stack);
    cout << "Size: " << getStackSize(stack) << endl;

    // Testing reverse
    std::cout << "----TEST2----" << endl;
    Node* stack2 = nullptr;
    push(stack2, 1);
    push(stack2, 2);
    push(stack2, 3);
    push(stack2, 4);
    push(stack2, 5);
    push(stack2, 6);
    push(stack2, 7);
    printStack(stack2);
    reverse(stack2);
    printStack(stack2);
    reverse(stack2);
    printStack(stack2);

    // Testing merge
    std::cout << "----TEST3----" << endl;
    Node* teststack1 = nullptr;
    push(teststack1, 10);
    push(teststack1, 11);
    push(teststack1, 12);
    push(teststack1, 13);
    Node* teststack2 = nullptr;
    push(teststack2, 20);
    push(teststack2, 21);
    push(teststack2, 22);
    push(teststack2, 23);

    std::cout << "1 stos" << endl;
    printStack(teststack1);
    std::cout << "2 stos" << endl;
    printStack(teststack2);
    Node* mergedstack = merge(teststack1, teststack2);
    std::cout << "polaczone stosy" << endl;
    printStack(mergedstack);

    // Testing sort
    std::cout << "----TEST4----" << endl;
    Node* sortstack1 = nullptr;
    push(sortstack1, 3);
    push(sortstack1, 1);
    push(sortstack1, 8);
    push(sortstack1, 4);
    push(sortstack1, 12);
    push(sortstack1, 5);
    push(sortstack1, 6);
    push(sortstack1, 9);
    push(sortstack1, 0);
    push(sortstack1, 2);
    push(sortstack1, 6);
    push(sortstack1, 11);
    printStack(sortstack1);
    Sort(sortstack1);
    std::cout << "posortowalismy stos" << endl;
    printStack(sortstack1);

    // Testing sort
    std::cout << "----TEST5----" << endl;
    printAsMermaidGraph(sortstack1);

    std::cout << "----TEST6----" << endl;
    std::string test = "a*b*c+d*f+g+h";
    std::string postfix = infixtopostfix(test);
    std::cout << test << endl;
    std::cout << postfix << endl;
    std::string test2 = "a+b*(c^d-e)^(f+g*h)-i";
    std::string postfix2 = infixtopostfix(test2);
    std::cout << test2 << endl;
    std::cout << postfix2 << endl;
    return 0;
}

/* todo
 infixToPostfixViaStack
*/
Editor is loading...
Leave a Comment