【剑指Offer】BM49 表达式求值

题目地址:牛客网

描述

请写一个整数计算器,支持加减乘三种运算和括号。

数据范围:0\le |s| \le 1000≤∣s∣≤100,保证计算结果始终在整型范围内

要求:空间复杂度: O(n)O(n),时间复杂度 O(n)O(n)

示例1

输入:

"1+2"

复制返回值:

3

复制

示例2

输入:

"(2*(3-4))*5"

复制返回值:

-10

复制

示例3

输入:

"3+2*3*4-1"

复制返回值:

26 

思路:

 之前一篇写了,这题也是套用了那题的代码。

中缀表达式

代码:

 

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    int solve(string a) {
    a=a+'@';
        // write code here
        for(int i=0; i<a.length()-1;i++)
        {
        if(i==0&&a[i]=='-')
            a='0'+a;
        else if(a[i]=='-'&&a[i-1]=='(')//右括号后面的负号
            a.insert(i,"0");//在第i位置插入0
        }
    map<char, int> p;
    p['+']=p['-']=1;
    p['*']=p['/']=2;
    p['(']=0;
    queue<char> h;//后缀
    stack<char> f;//符号
    for(int i=0;i<a.length()-1;i++)
    {
        if(a[i]>='0'&&a[i]<='9'){
        	h.push(a[i]);
        	if(!(a[i+1]>='0'&&a[i+1]<='9')){
        		h.push(' ');
			}
		}
        else{
            if(a[i]=='('){
                f.push(a[i]);
            }
            else if(a[i]==')'){
                while(f.top()!='(')
                {
                    h.push(f.top());
                    f.pop();
                }
                f.pop();
            }
            else
            {
                while(f.size()&&p[f.top()]>=p[a[i]]){
                    h.push(f.top());
                    f.pop();
                }
                f.push(a[i]);
            }

    	}
    }
    while(f.size()){
    	h.push(f.top());
    	f.pop();
	}
    //求后缀
	stack<int> s;
	int t=0;
    while(h.size()){
    	char b=h.front();
    	h.pop();
    	int c=0,d=0;
    	int sum=0;
    	if(b==' '){
       	 	s.push(t);
       	 	t=0;
   	 	}
    	else if(b>='0'&&b<='9')
    	{
    	    t=t*10+int(b-'0');
    	}
   		else{
        	d=s.top();
        	s.pop();
        	c=s.top();
        	s.pop();
        	if(b=='+')sum=c+d;
        	else if(b=='-')sum=c-d;
        	else if(b=='*')sum=c*d;
       	 	else sum=c/d;
        	s.push(sum);
    	}
    }
    return s.top();
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值