c++ - 多位后缀表达式

标签 c++ stack

我写了这段代码,但只在第一次操作时有效,例如 1 2 + 它打印 3 作为结果,但我需要给它一个这样的表达式:1 2 + 3 4 - * 并且它必须返回值3. 取而代之的是,我的代码打印了 2115。

#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main() {
  float op1,op2,value;
  string expression;
  cin>>expression;
  stack<float>p;
  for (int i=0;i<expression.length();++i){
    if (expression[i] != '+' && expression[i] != '-' && expression[i] != '*' && expression[i] != '/'){
      if (expression[i] != ' '){
        p.push(expression[i]);
      }
      else{
        continue;
      }
    }
    if (expression[i] == '+'){
      op1=p.top()-'0';p.pop();
      op2=p.top()-'0';p.pop();
      value=op1+op2;
      p.push(value);
    }
    if (expression[i] == '-'){
      op1=p.top()-'0';
      p.pop();
      op2=p.top()-'0';
      p.pop();
      value=op1-op2;
      p.push(value);      
    }
    if (expression[i]=='*'){
      op1=p.top()-'0';
      p.pop();
      op2=p.top()-'0';
      p.pop();
      value=op1*op2;
      p.push(value);  
    }
    if (expression[i]=='/'){
      op1=p.top()-'0';p.pop();
      op2=p.top()-'0';p.pop();
      value=op1/op2;
      p.push(value);        
       }
      }
      cout<<value<<endl;
    }

最佳答案

一些修改

#include <iostream>
#include <string>
#include <stack>
#include <sstream>
#include <vector>

using namespace std;
int main() {
  float op1,op2,value;
  string inputs ;
  stack<float> p;
  vector<string> nodes ;

    op1=op2=value=0 ;   // initialize to zero.

    getline(cin, inputs) ;
    cout << "input :" << inputs << endl ;

    // tokenning by space
    stringstream ss(inputs) ;
    string item ;
    while (getline(ss, item, ' ') ) {
       nodes.push_back(item) ;
       cout << "token : "<<item << endl ;
    }

  for (int i=0;i<nodes.size();i++){
    string node = nodes[i] ;
    if ( isdigit(node[0]) ) {
        p.push(stof(node));
        cout << "push(num) :" << node << endl;
        continue ;
    }
    if (node == "+"){
      op2=p.top(); p.pop();
      op1=p.top(); p.pop();
      value=op1+op2;
      cout << "add : "<<op1 << " " << op2 << "="<<value << endl;
      p.push(value);
    }
    if (node == "-"){
      op2=p.top(); p.pop();
      op1=p.top(); p.pop();
      value=op1-op2;
      cout << "minus : "<<op1 << " " << op2 << "="<<value << endl;
      p.push(value);      
    }
    if (node=="*"){
      op2=p.top(); p.pop();
      op1=p.top(); p.pop();
      value=op1*op2;
      p.push(value);  
      cout << "mul : "<<op1 << " " << op2 << "="<<value << endl;
    }
    if (node=="/"){
      op2=p.top(); p.pop();
      op1=p.top(); p.pop();
      value=op1/op2;
      p.push(value);        
      cout << "div : "<<op1 << " " << op2 << "="<<value << endl;
     }
  }
  cout<< "result="<< value<<endl;
} 

输出测试

$ ./a.out
1 2 + 3 4 - *
input :1 2 + 3 4 - *
token : 1
token : 2
token : +
token : 3
token : 4
token : -
token : *
push(num) :1
push(num) :2
add : 1 2=3
push(num) :3
push(num) :4
minus : 3 4=-1
mul : 3 -1=-3
result=-3

$ ./a.out
4.5 1.5 + 9.0 3.0 / +
input :4.5 1.5 + 9.0 3.0 / +
token : 4.5
token : 1.5
token : +
token : 9.0
token : 3.0
token : /
token : +
push(num) :4.5
push(num) :1.5
add : 4.5 1.5=6
push(num) :9.0
push(num) :3.0
div : 9 3=3
add : 6 3=9
result=9

关于c++ - 多位后缀表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49270173/

相关文章:

c++ - std::cin 真的很慢

Eclipse:用于剪切、复制和粘贴的堆叠还是堆叠?

java - 如何返回链表中的元素数量

c++ - 如何实现堆栈列表的删除功能?

c++ - 如何接收、修改和替换文本文件中的一行?

c++ - 如何在 OpenGL 中制作好看的 cel 着色线?

java - 为什么有些单词没有被检查或包含在反向单词串中?

assembly - 缓冲区溢出攻击(攻击实验室第 2 阶段)

c++ - Gtkmm - 在不关闭应用程序的情况下隐藏窗口

c++ - GLM - 是否保证 vector 和矩阵的内存等同于它们的 GLSL 对应项?