表达式计算3 +-*/^() 数据没有负数 后缀表达式

 
From Admin
表达式计算3
 
   
   
 描述 Description  
  给出一个表达式,其中运算符仅包含+,-,*,/,^要求求出表达式的最终值

在这里,"/"为整除

最终结果为正整数,数据保证不需要使用高精度!

   
   
 输入格式 Input Format 
  仅一行,即为表达式
   
   
 输出格式 Output Format 
  仅一行,既为表达式算出的结果 结果小于maxlongint,且整个计算的过程中,也不会超过maxlongint
   
   
 样例输入 Sample Input  
 
   
   
 样例输出 Sample Output  
 
   
   
 时间限制 Time Limitation 
  各个测试点1s
   
   
 注释 Hint 
  表达式总长度<=20
 

 

 

 

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<stack>
#include<cctype>
#include<cstdlib>
using namespace std;
const int N=1000;
char _stack[N];//运算符的栈
int top;//初始化为-1
int _pow(int x,int y)
{
    if(y==0) return 1;
    if(y==1) return x;
    int cnt;
    cnt=_pow(x,y/2);
    cnt=cnt*cnt;
    if(y&1) cnt*=x;
    return cnt;
}
void _change(string &str,string &res)//第一个参数为中缀表达式,第二个为后缀表达式,初始为空
{
    top=-1;
    int len=str.size();
    for(int i=0;i<len;i++)
    {
        switch(str[i])
        {
            case '(':_stack[++top]='(';break;

            case '+':
            case '-':while(top>=0&&_stack[top]!='(')
                           res+=_stack[top--];
                     _stack[++top]=' ';//空格很重要 分隔数字的
                     _stack[++top]=str[i];
                     break;

            case '*':
            case '/':while(top>=0&&_stack[top]!='('&&_stack[top]!='+'&&_stack[top]!='-')
                           res+=_stack[top--];
                     _stack[++top]=' ';
                     _stack[++top]=str[i];
                     break;

            case '^':while(top>=0&&_stack[top]!='('&&_stack[top]!='+'&&_stack[top]!='-'&&_stack[top]!='*'&&_stack[top]!='/')
                           res+=_stack[top--];
                     _stack[++top]=' ';
                     _stack[++top]=str[i];
                     break;

            case ')':while(_stack[top]!='(')
                           res+=_stack[top--];
                     top--;
                     break;
            default:res+=str[i];
                    if(i==len-1) res+=' ';
                    else if(!isdigit(str[i+1])) res+=' ';
        }
    }
    while(top>=0)
    {
        res+=_stack[top--];
    }
}
int _value(string str)//参数为后缀表达式
{
    int cnt,len=str.size();
    top=-1;
    int _digit[N];
    for(int i=0;i<len;i++)
    {
        switch(str[i])
        {
        case ' ':break;//空格很重要 分隔数字的
        case '+':cnt=_digit[top-1]+_digit[top];
                 _digit[--top]=cnt;
                 break;
        case '-':cnt=_digit[top-1]-_digit[top];
                 _digit[--top]=cnt;
                 break;
        case '*':cnt=_digit[top-1]*_digit[top];
                 _digit[--top]=cnt;
                 break;
        case '/':cnt=_digit[top-1]/_digit[top];//此题为整除,因题而异
                 _digit[--top]=cnt;
                 break;
        case '^':cnt=_pow(_digit[top-1],_digit[top]);
                 _digit[--top]=cnt;
                 break;
        default:string temp;
                while(i<len&&isdigit(str[i])) temp+=str[i],i++;i--;
                _digit[++top]=atoi(temp.c_str());
        }
    }
    return _digit[0];
}
int main()
{
    string str,res;
    while(cin>>str)
    {
        res.clear();
        _change(str,res);
        int cnt=_value(res);
        printf("%d/n",cnt);
    }
    return 0;
}
/*
1*2+3*4+5+6*7
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值