골든 프로그래머 면접 - 면접 질문 16.26 계산기 (스택)

1. 주제

양의 정수이고, 플러스 (+)을 감안할 때, 감산 (-), 곱하기 (*), 연산 식을 제외 (/) (괄호 안의 제외한다), 그 결과를 산출한다.

발현은 음이 아닌 정수만을 포함 +, - ,*,/네 피연산자 및 스페이스. 정수 나누기는 정수 부분을 유지합니다.

示例 1:
输入: "3+2*2"
输出: 7

示例 2:
输入: " 3/2 "
输出: 1

示例 3:
输入: " 3+5 / 2 "
输出: 5

说明:
你可以假设所给定的表达式都是有效的。
请不要使用内置的库函数 eval。

출처 : 숙박 버튼 (LeetCode)
링크 : HTTPS는 : //leetcode-cn.com/problems/calculator-lcci
모든 네트워크에서 공제 저작권. 상업 무단 전재 소스를 표시하시기 바랍니다 승인 된 공식, 비상업적 재판에 문의하시기 바랍니다.

2. 문제 해결

几个易错例子
"2147483647"
" 3+5 / 2 "
"+3+2*2"
"-3+2*2"
class Solution {
public:
    int calculate(string s) {
    	long a, sum, i = 0;
    	char op = '+';
        while(i < s.size() && s[i]==' ')
            i++;//处理空格
    	stack<int> stk;
    	if(i < s.size() && s[i] == '+')
    		i++;
    	else if(i < s.size() && s[i] == '-')
    	{
    		op = '-';
    		i++;
    	}
    	for( ; i < s.size(); ++i)
    	{
    		a = 0;
            while(i < s.size() && s[i]==' ')
                i++;//处理空格
    		while(i < s.size() && isdigit(s[i]))
    			a = a*10+s[i++]-'0';
			if(op == '*')
    		{	
    			a = stk.top() * a;
    			stk.pop();
    			sum = 0;
    			while(!stk.empty())
    			{
    				sum += stk.top();
    				stk.pop();
    			}
    			stk.push(sum);
    			stk.push(a);
    		}
    		else if(op == '/')
    		{	
    			a = stk.top() / a;
    			stk.pop();
    			sum = 0;
    			while(!stk.empty())
    			{
    				sum += stk.top();
    				stk.pop();
    			}
    			stk.push(sum);
    			stk.push(a);
    		}
    		else if(op == '-')
    			stk.push(-a);
    		else
    			stk.push(a);
            while(i < s.size() && s[i]==' ')
                i++;//处理空格
    		if(i < s.size())
    			op = s[i];
    	}
    	sum = 0;
    	while(!stk.empty())
    	{
    		sum += stk.top();
    		stk.pop();
    	}
    	return sum;
    }
};

20 ms 8.8 MB

게시 된 807 개 원래 기사 · 원 찬양 1552 ·은 380,000 + 조회수

추천

출처blog.csdn.net/qq_21201267/article/details/105314775