【LeetCode】224. Basic Calculator

Basic Calculator

Implement a basic calculator to evaluate a simple expression string.

The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and empty spaces .

You may assume that the given expression is always valid.

Some examples:

"1 + 1" = 2
" 2-1 + 2 " = 3
"(1+(4+5+2)-3)+(6+8)" = 23

Note: Do not use the eval built-in library function.

两个要点:

1、无括号时,顺序执行

2、有括号时,先执行括号中的

两个栈:

一个存放操作数,每次进栈要注意,如果操作符栈顶元素为‘+‘/‘-‘,则需要立即计算。

一个存放操作符(包括括号),每次出现‘)‘时,不断进行出栈计算再进栈,直到弹出‘(‘,说明当前括号内计算完毕。

class Solution {
public:
    int calculate(string s) {
        stack<int> num;
        stack<int> op;
        int i = 0;
        while(i < s.size())
        {
            while(i < s.size() && s[i] == ‘ ‘)
                i ++;
            if(i == s.size())
                break;
            if(s[i] == ‘+‘ || s[i] == ‘-‘ || s[i] == ‘(‘)
            {
                op.push(s[i]);
                i ++;
            }
            else if(s[i] == ‘)‘)
            {
                while(op.top() != ‘(‘)
                {// calculation within parentheses
                    int n2 = num.top();
                    num.pop();
                    int n1 = num.top();
                    num.pop();
                    if(op.top() == ‘+‘)
                        num.push(n1 + n2);
                    else
                        num.push(n1 - n2);
                    op.pop();
                }
                op.pop();
                while(!op.empty() && op.top() != ‘(‘)
                {
                    int n2 = num.top();
                    num.pop();
                    int n1 = num.top();
                    num.pop();
                    if(op.top() == ‘+‘)
                        num.push(n1 + n2);
                    else
                        num.push(n1 - n2);
                    op.pop();
                }
                i ++;
            }
            else
            {
                int n = 0;
                while(i < s.size() && s[i] >= ‘0‘ && s[i] <= ‘9‘)
                {
                    n = n*10 + (s[i]-‘0‘);
                    i ++;
                }
                num.push(n);
                while(!op.empty() && op.top() != ‘(‘)
                {
                    int n2 = num.top();
                    num.pop();
                    int n1 = num.top();
                    num.pop();
                    if(op.top() == ‘+‘)
                        num.push(n1 + n2);
                    else
                        num.push(n1 - n2);
                    op.pop();
                }
            }
        }
        return num.top();
    }
};

时间: 2024-10-07 04:12:39

【LeetCode】224. Basic Calculator的相关文章

【LeetCode】227. Basic Calculator

Problem: Implement a basic calculator to evaluate a simple expression string. The expression string contains only non-negative integers, +, -, *, / operators and empty spaces . The integer division should truncate toward zero. You may assume that the

【LeetCode】227. Basic Calculator II

Basic Calculator II Implement a basic calculator to evaluate a simple expression string. The expression string contains only non-negative integers, +, -, *, / operators and empty spaces . The integer division should truncate toward zero. You may assu

【leetcode】Generate Parentheses

题目: 给定整数n,返回n对匹配的小括号字符串数组. For example, given n = 3, a solution set is: "((()))", "(()())", "(())()", "()(())", "()()()" 分析: 这种问题的模式是:1)问题的解有多个 ,2)每个解都是由多个有效的 "步骤" 组成的,3)变更以有解的某个或某些"步骤"

【LeetCode】Implement strStr()

Implement strStr() Implement strStr(). Returns a pointer to the first occurrence of needle in haystack, or null if needle is not part of haystack. 标准KMP算法.可参考下文. http://blog.csdn.net/yaochunnian/article/details/7059486 核心思想在于求出模式串前缀与后缀中重复部分,将重复信息保存在n

【LeetCode】Add Two Numbers

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list. Input: (2 -> 4 -> 3) + (5 -> 6 ->

【LeetCode】Pascal&#39;s Triangle

Pascal's Triangle Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Return [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] 这题别想用通项公式做,n choose m里面的连乘必然溢出,老老实实逐层用定义做. class Solution { public: vector<vector<

【LeetCode】Copy List with Random Pointer

A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null. Return a deep copy of the list. 思路:第一遍正常复制链表,同时用哈希表保存链表中原始节点和新节点的对应关系,第二遍遍历链表的时候,再复制随机域. 这是一种典型的空间换时间的做法,n个节点,需要大小为O(n

【leetcode】Max Points on a Line (python)

给定一个点,除该点之外的其他所有点中,与该点的关系要么是共线,要么就是共点,也就是两点重合. 共线有三种情况:水平共线,垂直共线,倾斜的共线.合并下这三种情况就是斜率存在的共线和斜率不存在的共线. 那么我们的任务就是针对每个点,找出与其共线的这些情况中,共线最多的点的个数. 注意:最终的结果别忘了加上共点的个数. class Solution: def maxPoints(self, points ): if len( points ) <= 1: return len( points ) ma

【LeetCode】 Maximum Subarray

Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, given the array [−2,1,−3,4,−1,2,1,−5,4], the contiguous subarray [4,−1,2,1] has the largest sum = 6. More practice: If you have figu