表达式求值

#include<iostream>
#include <unordered_map>
using namespace std;  
const int N=10010;
char op[N];int num[N];
int idx1=-1,idx2=-1;//模拟栈
void cal()
{
   int b=num[idx2--];
   int a=num[idx2--];
   //注意a,b顺序
   char c=op[idx1--];
   int x=0;
   if(c=='+')x=a+b;
   else if(c=='-')x=a-b;
   else if(c=='*')x=a*b;
   else if(c=='/')x=a/b;
   
   num[++idx2]=x;//压入x
}
bool isnum(char a)
{
  if(a>='0'&&a<='9')return true;
  return false;
}
int main()
{
  string s;cin>>s;
  unordered_map<char,int>pr={{'+',1},{'-',1},{'*',2},{'/',2}};
  //优先级
  for(int i=0;i<s.size();i++)
  {
    if(isnum(s[i]))
    {
      int j=i,x=0;
      while(j<s.size()&&isnum(s[j]))
      {
        x=x*10+s[j]-'0';//不可能只是个数
        j++;
      }
      num[++idx2]=x;
      i=j-1; //i要循环后要++
    }
    else if(s[i]=='(')op[++idx1]='(';//直接入栈
    else if(s[i]==')')
    {
      while(s.size()&&op[idx1]!='(')cal();//遇到'('是才计算,把'('删了
      idx1--;
    }
    else 
    {
      while(s.size()&&op[idx1]!='('&&pr[op[idx1]]>=pr[s[i]])
      //+-*/除非遇到'('才或优先级大于栈顶停止运算
          cal();
      op[++idx1]=s[i];
    }
  }
  while(idx1+1) cal();
  cout<<num[idx2]<<endl;
  return 0 ;

}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值