Здравствуйте, я новичок в программировании, и я пытаюсь сделать калькулятор 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 Нажмите любую клавишу, чтобы продолжить. ,.