我的反向抛光记谱计算器需要帮助

时间:2014-12-11 05:56:38

标签: c++ stack istringstream postfix-notation

我正在制作一个程序来制作反向抛光记谱计算器,我想知道是否有人可以给我一些提示。计算器将从用户那里获取一行,如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
//}

结果我得到了奇怪的数字。 我是否正确阅读了我的堆栈?

2 个答案:

答案 0 :(得分:3)

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

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

当你真正想要的时候:

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

同样正确的是你:

if (ch='+') {
你可能的意思是:

if (ch=='+') {

=是分配(您将ch设置为'+')而==是比较(您正在测试ch是否等于{ {1}})

答案 1 :(得分:0)

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

有线数字输出的原因是您在堆栈中也有运算符的浮点值,并循环遍历字符串以查找运算符。因此,对于示例2 3 + 7 4 - *。您将使堆栈为2 3 float(+)7 4 float( - )float(*)&lt; -being stack top。所以当你遍历字符串并找到&#39; +&#39;符号。你添加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();
}