简体   繁体   English

前缀计算器 - 在某些情况下不起作用 - C ++

[英]Prefix Calculator — won't work for some cases — C++

I am working on creating a Prefix calculator, where the user enters a prefix expression, and the program evaluates it. 我正在创建一个前缀计算器,用户输入前缀表达式,程序对其进行评估。 It is working for some cases, eg "+43" outputs 7 as it should, but "/-421" outputs "2", when it should output "1", and "/+421" outputs "6" rather than "3", things like that. 它适用于某些情况,例如“+43”输出7应该是,但“/ -421”输出“2”,当它应输出“1”,而“/ + 421”输出“6”而不是“ 3“,这样的事情。 Any suggestions for fixing that? 有任何修复建议吗? I'm going to add exceptions later, so they are commented out for now. 我稍后会添加例外,所以他们暂时被注释掉了。

PrefixCalculator.cpp PrefixCalculator.cpp

#pragma once

#include <sstream>

using namespace std;

template<class T>
class PrefixCalculator {
public:
PrefixCalculator(void){
    numOperator = 0;
    numOperand = 0;
};
~PrefixCalculator(void){};

T eval(istringstream&);

int getNumOperator() {
    return numOperator;
};

int getNumOperand() {
    return numOperand;
};

private:
//if you feel you need private helper functions and/or helper data
int numOperator;
int numOperand;
};

template<class T>
T PrefixCalculator<T>::eval(istringstream& input) { 
 //this function needs to throw an exception if there's a problem with the expression or operators
char nextChar = input.peek();

//this while loop skips over the spaces in the expression, if there are any
while(nextChar == ' ') {
    input.get();    //move past this space
    nextChar = input.peek(); //check the next character
}

if(nextChar == '+') {
    input.get();    //moves past the +
    numOperator++;
    return eval(input) + eval(input);   //recursively calculates the first expression, and adds it to the second expression, returning the result
}

/***** more operators here ******/
if(nextChar == '-') {
    input.get();
    numOperator++;
    return eval(input) - eval(input);
}

if(nextChar == '*') {
    input.get();
    numOperator++;
    return eval(input) * eval(input);
}

if(nextChar == '/') {
    input.get();
    numOperator++;
    return eval(input) / eval(input);
} 

/******  BASE CASE HERE *******/
//it's not an operator, and it's not a space, so you must be reading an actual value (like '3' in "+ 3 6".  Use the >> operator of istringstream to pull in a T value!
input>>nextChar;
T digit = nextChar - '0';
numOperand++;
return digit;
//OR...there's bad input, in which case the reading would fail and you should throw an exception

}

driver.cpp driver.cpp

#include <sstream>
#include <string>
#include <iostream>
#include "PrefixCalculator.h"

using namespace std;

int main(int argc, char** argv) {
PrefixCalculator<int> calc;

string expression;
cout << "Give a prefix expression to evaluate, or q to quit." << endl;
getline(cin,expression);

while(expression[0] != 'q') {
    //try {
        int result = calc.eval(istringstream(expression));
        cout << result << endl;
    //}
    //catch { //will not compile, you have to finish this!
    //  
    //}

    cout << "Give a prefix expression to evaluate or q to quit." << endl;
    getline(cin,expression);
}

return 0;
 }

I'm confused. 我糊涂了。 From the output you gave, your program is working correctly, but your expectations are not correct. 根据您提供的输出,您的程序运行正常,但您的期望不正确。

Let's evaluate the expression "/-421": 让我们评估表达式“/ -421”:
1. Operator detected, '/', push onto stack: 1.操作员检测到'/',推入堆栈:

+----+
| /  |
+====+

Operator detected, '-', push onto stack: 操作员检测到' - ',推入堆栈:

+---+  
| - |  
+---+  
| / |  
+===+  

Number detected, push onto stack since previous operator requires 2 parameters. 检测到的数字,因为之前的操作员需要2个参

+---+
| 4 |
+---+
| - |
+---+
| / |
+===+

Number dectected, the 2nd of of two operators. 检测到的数字,两个运营商中的第二个。
Pop the remaining operand off the stack, 4. 将剩余的操作数弹出堆栈,4。
Pop the operation off the stack evaluate with the parameters: 从堆栈弹出操作评估参数:

result = 4 - 2 --> 1

Push result on the stack. 将结果推到堆栈上。

+---+
| 2 |
+---+
| / |
+===+

Number detected, the 2nd parameter of 2 for the division operator. 检测到的数字,除法运算符的第2个参数2。
Pop the number from the stack, this becomes the 1st parameter to the division operation. 弹出堆栈中的数字,这将成为除法运算的第一个参数。
Pop the operation off the stack and evaluate with the parameters: 从堆栈弹出操作并使用参数进行评估:

result = 2 / 1 --> 2

Push the result on the stack. 将结果推入堆栈。

+---+
| 2 |
+===+

End of expression reached, pop off result and print: 达到结束表达式,弹出结果并打印:

2

Edit 1: 编辑1:

You can confirm your program's operation by printing the stack (one item per line) before analyzing the next token. 您可以在分析下一个令牌之前打印堆栈(每行一个项目)来确认程序的操作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM