表达式求值

#include <iostream>  
#include<stack>   
using namespace std;  
                      //+、 -、 *、 /、(、 )、#//
char Relation[7][7]=   { {'>','>','<','<','<','>','>'},//栈顶元素  +
{'>','>','<','<','<','>','>'},//   -
{'>','>','>','>','<','>','>'},//   *
{'>','>','>','>','<','>','>'},//   /
{'<','<','<','<','<','=','>'},//   (
{'>','>','>','>','=','>','>'},//    )
                        {'<','<','<','<','<','<','='}};//   #
bool isOperators(char ch)
{
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#')
return true;
else
return false;
}
int ConvertToIndex(char opr)    
{    
    int index;    
    
    switch (opr)    
    {    
    case '+':    
        index = 0;    
        break;    
    case '-':    
        index = 1;    
        break;    
    case '*':    
        index = 2;    
        break;    
    case '/':    
        index = 3;    
        break;    
    case '(':    
        index = 4;    
        break;    
    case ')':    
        index = 5;    
        break;    
    case '#':    
        index = 6;    
        break;    
    }    
    
    return index;    
}    
char precede(char op1,char op2)
{
int num1=ConvertToIndex(op1);
int num2=ConvertToIndex(op2);
return Relation[num1][num2];
}
 int Operate(int num1,char op,int num2)
 {
 int ret;
 switch(op)
 {
case '+': 
       ret=num1+num2;
  break;
case '-':
       ret=num1-num2;
  break;
case '*':
       ret=num1*num2;
 break;
case '/':  
       ret=num1/num2;
 break;
 }
 return ret;
 }
int caculate (string str)
{
  stack<int> spnd;
  stack<char> sptr;
  int i=0;
  str+='#';
  char ch=str[i++];
  sptr.push('#');
  while(sptr.top()!='#'||ch!='#')
  {
 if(!isOperators(ch))
 {
  int a=ch-'0';
  spnd.push(a);
  ch=str[i++];
 }
 else
 {
   char exp=precede(sptr.top(),ch);
if(exp=='>')//栈顶优先级大
{
int num2=spnd.top();
spnd.pop();
int num1=spnd.top();
spnd.pop();
char op=sptr.top();
sptr.pop();
int ret=Operate(num1,op,num2);
spnd.push(ret);
}
if(exp=='<')//栈顶优先级小
{
sptr.push(ch);
ch=str[i++];
}
if(exp=='=')//括号匹配弹出
{
sptr.pop();
ch=str[i++];
}
 
 }

 
  }
  return spnd.top();
}
int main ()
{
  char chr[1025];
  cin>>chr;
  string s=string (chr);
  int res;
  int flag=1;
  for(int i=0;i<s.size();i++)
  {
   if(!(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'||s[i]=='('||s[i]==')'||isdigit(s[i])))  
{
  flag=0;
  break;
}


  }
  if(flag)
{
res=caculate (s);
flag=1;
cout<<res<<endl;
}
  else
  cout<<false<<endl;
  return 0;
}

知识点isdigit(s[i])检查参数c是否为阿拉伯数字0到9。运算符的优先关系比较

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值