1

我正在开发一个制作反向波兰符号计算器的程序,我想知道是否有人可以给我一些提示。计算器将从用户那里获取一行,例如2 3 + 7 4 - *;中间有空格,我想在每次操作后打印一个结果。

这是我的代码的一部分

#include <iostream>
#include <string>
#include <stack>
#include <sstream>
using namespace std;

int main() {
  stack<float>stack;
  int i;
  float num,result,first,second;
  char op,ch;
  string str;

  getline(cin,str);
  istringstream is(str);
  for(int i=0;i<str.size();i++) {
    is>>num;
    stack.push(num);
  }
  for (i=0;i<str.size();++i) {
    ch=str[i];
  }
  if (ch=='+'||'-'||'*'||'/') {
    if (ch='+') {
      first=stack.top();
      stack.pop();
      second=stack.top();
      stack.pop();
      result=first+second;
      stack.push(result);
      cout<<result;
    }
//  } // missing from question
//}

结果我得到了奇怪的数字。我在我的堆栈中阅读正确吗?

4

2 回答 2

3

这可能不是您唯一的问题,但您有:

if (ch=='+'||'-'||'*'||'/') {

当您可能实际上是指:

if (ch=='+' ||
    ch=='-' ||
    ch=='*' ||
    ch=='/') {

此外,您还拥有:

if (ch='+') {

你可能实际上的意思是:

if (ch=='+') {

=是赋值(您设置ch'+'),而==is 比较(您正在测试是否ch等于'+'

于 2014-12-11T06:29:26.180 回答
0

一种干净而优雅的方法是将所有条目作为浮点数推入堆栈(如果不是运算符),并在遇到运算符时在堆栈上执行弹出操作获取运算符。如果它的操作符执行两次弹出并获取操作符并执行适当的操作并将结果推回堆栈

有线数字输出的原因是您在堆栈中也有运算符的浮点值,并且您循环遍历字符串以查找运算符。因此,对于示例 2 3 + 7 4 - * 。您将堆栈为 2 3 float(+) 7 4 float(-) float(*)<-作为堆栈顶部。因此,当您遍历字符串并找到“+”符号时。您添加 float(*) 和 float(-) 的值并将其推入堆栈。我希望这将使您的疑问清楚。:)

编辑:这是上述解释的代码。

#include <iostream>
#include <string.h> 
#include <stack>
#include <sstream>
#include <stdlib.h>

using namespace std ;

int main()
{stack<float>stack;
int i;
float num,result,first,second;  
char op,ch;
string str,str1;

getline(cin,str);
istringstream is(str); 

for(;is>>str1;){

if(str1.compare("+")==0){

    first=stack.top();
    stack.pop();
    second=stack.top();
    stack.pop();


    stack.push(first+second);

    }else if(str1.compare("-")==0){

    first=stack.top();
    stack.pop();
    second=stack.top();
    stack.pop();
    stack.push(first-second);
    }else if(str1.compare("*")==0){

    first=stack.top();
    stack.pop();
    second=stack.top();
    stack.pop();
    stack.push(first*second);
    }else if(str1.compare("/")==0){

    first=stack.top();
    stack.pop();
    second=stack.top();
    stack.pop();
    stack.push(first/second);
    }else{

    stack.push(strtof(str1.c_str(),NULL));              
    }
}
cout<<"The result of the expression is:"<<stack.top();
} 
于 2014-12-11T06:25:28.683 回答