Переполнение стека при попытке преобразовать инфиксное выражение в постфикс - PullRequest
0 голосов
/ 20 октября 2019
class stack {
    char* stk;
    unsigned int maxSize;
    int top;
public:
    stack() {
        std::cout << "Enter the max size of stack: ";
        std::cin >> maxSize;
        top = 0;
        stk = new char[maxSize];
    }
    stack(int x) {
        maxSize = x;
        top = 0;
        stk = new char[maxSize];
    }
    bool isEmpty() {
        return(top == 0);
    }
    bool isFull() {
        return(top == maxSize);
    }
    void push(char x) {
        if (!isFull()) {
            stk[top++] = x;
        }
        else {
            std::cout << "Error: Stack overflow.\n";
        }
    }
    char pop() {
        if (!isEmpty()) {
            return stk[top--];
        }
        else {
            std::cout << "Error: Stack underflow.\n";
            return 0;
        }
    }
    char peek() {
        if (!isEmpty()) {
            char x = stk[top];
            return x;
        }
        else {
            std::cout << "Error: Stack underflow.\n";
            return 0;
        }
    }
};

bool isOperand(char ch)
{
    if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z')
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

std::string postFixConverter(std::string str) {

    int size = str.length();

    stack s(size);

    std::string post = "";

    for (int i = 0; i < size; i++)
    {
        if (isOperand(str[i])) {

            post += str[i];

        }
        else {

            switch (str[i])
            {
            case '(':
                s.push('(');
                break;
            case '^':
                s.push('^');
                break;
            case '+':
                s.push('+');
                break;
            case '-':
                s.push('-');
                break;
            case '*':
                s.push('*');
                break;
            case '/':
                s.push('/');
                break;
            case ')':
                while (s.peek() != '(') {
                    post += s.peek();
                    s.pop();
                }

                break;
            default:
                break;
            }

        }

    }

    do {

        post += s.pop();

    } while (s.isEmpty());

    return post;

}

Я пытаюсь закодировать функцию c ++, которая преобразует инфиксное выражение в постфикс. Я определил свой собственный стек и не использовал стек STL. Вершина стека инициализируется с top = 0 вместо top = -1. Проблема, кажется, где-то в случае переключателя ')', который содержит цикл, который используется для извлечения до тех пор, пока не будет найден символ '(', но стек всегда кажется переполненным. Я пытался решить эту проблему, но безуспешно.

...