控制台计算器将浮点数推入堆栈时出现问题

Problem pushing a float to stack for console Calculator

本文关键字:问题 堆栈 计算器 浮点数 控制台      更新时间:2023-10-16

我正在写一个基于c++控制台的计算器。

它的工作方式是reample由一个迭代器组成,该迭代器读取总和,并将所有数字放入堆栈中。-当读取方程遇到操作符时,例如:'+',它调用add()函数,该函数接受两个参数:add(float topOfStack, nextNumber());-nextNumber处理BODMAS,如果下一个数字正在被除法或乘法,它将首先解决这些问题,否则它将返回数字。-之前的和从堆栈中弹出,并将结果加到堆栈中。

这是我到目前为止写的代码:根据调试器,我在这行this->numberStack->push(f);中得到某种错误-但它没有告诉我问题是什么。如果你能帮助我,我会很感激的。

感谢代码:

    #include <iostream>
#include <cstdlib>
#include <sstream>
#include <string>
#include <cmath>
#include <cstring>
#include <stack>

using namespace std;
class Calculator
{
    public:
        Calculator();
        virtual ~Calculator();
        void readEquation();
        float nextInteger(int position);
        string equation;
    protected:
        float add(float firstNumber, float secondNumber);
        float subtract (float firstNumber, float secondNumber);
        float multiply (float number, float multiple);
        float divide (float numerator, float denominator);
        float squareRoot(float number);
        float square(float number);
    private:
        void temporaryPrintStack();
        float answer();
        stack<float>* numberStack;
};

Calculator::Calculator()
{
    //c
}
Calculator::~Calculator()
{
    //dtor
}
float Calculator::add(float numOne,float numTwo)
{
    return numOne+numTwo;
}
float Calculator::subtract(float numOne,float numTwo)
{
    return numOne-numTwo;
}
float Calculator::multiply(float number, float multiple)
{
    return number*multiple;
}
float Calculator::divide(float numerator, float denominator)
{
    return numerator/denominator;
}
float Calculator::square(float number)
{
    return number*number;
}
float Calculator::squareRoot(float number)
{
    return 0;
}
float Calculator::answer()
{
     return this->numberStack->top();
}
void Calculator::temporaryPrintStack()
{
    for(int index = 0; index <=  (int) this->numberStack->size();index++)
    {
        cout<<this->numberStack->top()<<", ";
        this->numberStack->pop();
    }
}
void Calculator::readEquation()
{
    int position=0;
    stringstream stringStream;
    string::iterator iterator;
    for(iterator = this->equation.begin();iterator!=this->equation.end();iterator++,position++)
    {
        if(*iterator>='0' && *iterator<='9' || *iterator=='.')//can this be replaced by isdigit()?
        {
            stringStream<<*iterator;
        }
        if(*iterator=='+')
        {
            string number;
            stringStream>>number;
            cout<<number<<" pushed to stack."<<endl;
            float f = atof(number.c_str());
            this->numberStack->push(f);
            //this->numberStack->push(this->add(this->numberStack->top(),this->nextInteger(position)));
            this->temporaryPrintStack();
        }
        if(*iterator=='=')
        {
            this->answer();
        }
    }
}
int main()
{
    Calculator *c=new Calculator();
    std::cout<<"Enter your sum in this form 2+2/1=";
    getline(cin,c->equation,'=');
    c->readEquation();
    system("pause");
    delete c;
    return 0;
}
stack<float>* numberStack;

声明你的类将保存一个指向stack<float>的指针。它不会而不是分配该对象。你需要自己做这件事(可能在构造函数中),还要注意在析构函数中删除该对象。

// in ctor
numberStack = new stack<float>;
// in dtor
delete numberStack;

或者,不要使用指针,而是使用普通对象。

看起来您忘记在Calculator构造函数中初始化堆栈了。实际上你可以简单地使用:

stack<float> numberStack;