C ++ Stack Calulator и ошибка чтения символов строки - PullRequest
0 голосов
/ 19 октября 2019

Здравствуйте, я новичок в программировании, и я пытаюсь сделать калькулятор RPN в Cpp. Я вроде понимаю, как это работает, но я не знаю, как его кодировать. Поэтому после поиска на YouTube я нашел видео с кем-то, кто использует калькулятор стека, который я собираюсь использовать в своем проекте. Я скопировал все, что запускает программа, но она не отображает желаемый результат. Я отладил в Visual Studio, и он выдает ошибку {data = 0xcccccccccccccccc top = -858993460 size = -858993460}. Программа продолжает работать, но не делает то, что должна. любая помощь будет признательна.

Это первый файл, который определяет стек

#pragma once
// arraystack.h

#define STACK_H

template <class T>
class stack
{
private:
    T* data; // Pointer.
    int top;
    int size;
    void resize();
    bool needToResize();

public:
    stack()
    {
        size = 5;
        data = new T[size];
        top = 0;
    }
    void push(T item);
    T peek();
    T pop();
    bool isEmpty();
};

//#include "arraystack.cpp"
#include <stdexcept> // para manejar la excepcion de fuera de rango.


template <class T>
void stack<T>::push(T item)
{
    if (needToResize())
        resize();
    data[top] = item;
    top++;
}

template < class T >
T stack<T>::peek()
{
    if (top <= 0)
        throw std::out_of_range("Attempting to peek an empty stack.");
    return data[top - 1];
}

template<class T>
T stack<T>::pop()
{
    if (top <= 0)
        throw std::out_of_range("Attempting to pop an empty stack.");
    top--;
    return data[top];
}

template <class T>
bool stack<T>::needToResize()
{
    return (top == size);// si top es igual al size entonce sse necesita resize.
}

template <class T>
void stack<T>::resize()
{
    T* newdata = new T[2 * size];
    for (int i = 0; i < size; i++)
        newdata[i] = data[i];
    data = newdata;
    size *= 2;
}

template <class T>
bool stack<T>::isEmpty()
{
    return (top == 0);
}

Это второй файл, который определяет калькулятор

#pragma once
// calculator.h

#include <iostream>
#include <string>
#include "arraystack.h"

using namespace std;

// check if char is a digit.
bool isDigit(char c)
{
    return (c <= '0' && c <= '9'); // valor unicode de los numeros en 48 empieza 0.
}

//check if char is an operator
bool isOp(char c)
{
    return (c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')' || c == '^');
}

// determine the precedence of an operator
int getPrecendence(char c)
{
    switch (c)
    {
    case '+':
    case '-': return 1;
    case '*':
    case '/': return 2;
    case '(':
    case ')': return 3;
    default: return -1;
    }
}

// evaluate an arithmetic expression.
int operate(int val1, int val2, char op)
{
    if (op == '+') return val1 + val2;
    if (op == '-') return val1 - val2;
    if (op == '*') return val1 * val2;
    return val1 / val2; // se retorna esta porque es la unica op left. (sin expo)
}

//evaluate a string.
int evaluate(string s)
{
    stack<int> vals;
    stack<char> ops;

    int val = 0;
    int pos = 0;

    while (pos < s.length())
    {
        char spot = s[pos];
        if (isDigit(spot))
        {
            val = (val * 10) + (int)(spot - '0');
        }
        else if (isOp(spot))
        {
            if (spot == '(')
            {
                ops.push(spot);
                val = 0;
            }
            else if (vals.isEmpty())
            {
                vals.push(val);
                ops.push(spot);
                val = 0;
            }
            else if (spot == ')')
            {
                vals.push(val);
                while (ops.peek() != '(')
                {
                    spot = ops.pop();
                    val = vals.pop();
                    int prev = vals.pop(); // previous on the stack
                    val = operate(prev, val, spot);
                    vals.push(val);
                }
                ops.pop();
                vals.pop();
            }
            else
            {
                char prev = ops.peek();
                if (getPrecendence(spot) > getPrecendence(prev))
                {
                    vals.push(val);
                    ops.push(spot);
                    val = 0;
                }
                else
                {
                    int prevval = vals.pop();
                    int prevop = ops.pop();
                    prevval = operate(prevval, val, prevop);
                    vals.push(prevval);
                    ops.push(spot);
                    val = 0;
                }
            }
        }
        pos++;
    }

    while (!ops.isEmpty())
    {
        int prev = vals.pop();
        char spot = ops.pop();
        val = operate(prev, val, spot);
    }
    return val;
}

Этот файл тестирует

// arraystack.cpp (the tester class)
#include <iostream>
#include "calculator.h"
#include <string>

using namespace std;

int main()
{
    cout << evaluate("3 + 4 + 5") << endl; //  expected result 12
    cout << evaluate("3 * 4 + 5") << endl; // expected result 17
    cout << evaluate("3 + 4 * 5") << endl; // expected result 23
    cout << evaluate("(3 +4) * 5") << endl; // expected result 35
    system("pause");

    return 0;
}

Результаты, которые я получаю Результаты после запуска программы

Ошибки, отображаемые в отладчике Visual Studio Экран отладки Visual Studio

Я понятия не имею, что происходит. Любая помощь будет признательна. Вывод, который я получаю: -1667666 -1667666 -1667666 -9658676 Нажмите любую клавишу, чтобы продолжить. ,.

...