【问题标题】:Boolean Calculator How to check user input using stacks c++布尔计算器如何使用堆栈c ++检查用户输入
【发布时间】:2015-10-22 21:21:34
【问题描述】:

我正在做一个计算器,用户可以输入 ,=,&&,||, ==,!即 (2>3) 或 (2>3)&&(5=”之类的表达式。唯一有效的操作是“”。 这是检查输入是否匹配操作的函数

  void evalute_stack_tops(std::stack<double>& numbers, std::stack<char>& operations){

      double operand1,operand2;


      operand2= numbers.top();
      numbers.pop();
      operand1= numbers.top();
      numbers.pop();


if(operations.top()=='<')
 {

    numbers.push(operand1<operand2);

 }
else if (operations.top()=='>')
 {

    numbers.push(operand1>operand2);


 }

else if(operations.top()=='>='){

    numbers.push(operand1 >= operand2);
}





}

【问题讨论】:

  • 您的堆栈是单个字符,这就是为什么只有单个字符值比较有效。尝试制作一堆std::strings(或char *)。

标签: c++ stack boolean calculator


【解决方案1】:

operations 是一个stack&lt;char&gt; 即一堆字符。因此您一次只能访问一个字符。

如何解决?备选方案 1:

您需要扩展您的 if 块以检查 '&gt;''&lt;' 是否有机会后跟 '='

例子:

...
if(operations.top()=='<') {
    operations.pop(); 
    if (operations.top()=='=') {
        numbers.push(operand1<=operand2);
        operations.pop(); 
    }
    else numbers.push(operand1<operand2); // and let top of op stack unchanged
 }

我不知道您是如何推动运营的。我假设"&gt;=" 会以相反的顺序推送,所以首先是'=',然后是'&gt;'。如果你反其道而行之,你就必须适应。

如何解决?备选方案 2

或者,您可以考虑将operations 设为std::stack&lt;std::string&gt; 并推送包含完整运算符(一个或两个字符)的字符串,而不是一个字符一个字符。

这可能更容易:您只是不应该忘记在 if-expression

中的常量周围加上双引号而不是单引号

重要提示

请注意,单引号仅包含一个字符。一旦你有多个单个字符,你应该考虑使用双引号来表明你的意思是一个字符串。并使用 std::string 而不是 char。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 2017-03-29
    • 2019-03-28
    • 1970-01-01
    相关资源
    最近更新 更多