练习题 (七)

题目:

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

解答:

class Solution {
public:
    int calculate(string s) {
        // the given expression is always valid!!!
        // only + and - !!!
        // every + and - can be flipped base on it‘s depth in ().
        stack<int> signs;
        int sign = 1;
        int num = 0;
        int ans = 0;

        // always transform s into ( s )
        signs.push(1);

        for (auto c : s) {
            if (c >= ‘0‘ && c <= ‘9‘) {
                num = 10 * num + c - ‘0‘;
            } else if (c == ‘+‘ || c == ‘-‘) {
                ans = ans + signs.top() * sign * num;
                num = 0;
                sign = (c == ‘+‘ ? 1 : -1);
            } else if (c == ‘(‘) {
                signs.push(sign * signs.top());
                sign = 1;
            } else if (c == ‘)‘) {
                ans = ans + signs.top() * sign * num;
                num = 0;
                signs.pop();
                sign = 1;
            }
        }

        if (num) {
            ans = ans + signs.top() * sign * num;
        }

        return ans;
    }
};

心得:

这个解答是我参考答案得来的。这里用sign存放“+”号或者"-"号,用signs存放sign * signs.top()括号里的累积和,用signs.push(1)做了一个栈的底。把top和pop分开写,这样使top()可以参与运算。

还有一个重要的是,栈运算能起到类似递归的作用,但是递归感觉是从最外的括号运算到最里面的括号的,但是栈运算是从最里面的右括号开始。这个栈运算值得好好体会一下。

括号加四则运算的方法,好像书本上讲的是按照什么二叉树来做的,这个感觉以前理解过,不过这次又忘记了。遇到再说吧。

时间: 2024-11-10 05:22:24

练习题 (七)的相关文章

Java基础阶段综合练习

package com.模拟练习题一; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.Scanner; /** * 1.键盘输入10个数,放到数组中 a. 去除该数组中大于10的数 b. 将该数组中的数字写入到本地文件nu

操作系统原理-图书主题

第1章 操作系统概述 1.1 操作系统的概念 1.2 操作系统的历史回顾 1.3 操作系统的类型 1.4 操作系统的特征 1.5 操作系统与用户接口 1.6 操作系统的结构 1.7 操作系统的硬件环境 综合练习题一 第2章 处理器管理 2.1 多道程序设计 2.2 进程的描述 2.3 进程控制 2.4 进程互斥 2.5 信号量机制 2.6 进程同步 2.7 进程通信 2.8 死锁问题 2.9 处理器调度 2.10 线程的概念 综合练习题二 第3章 存储器管理 3.1 存储管理的概念 3.2 分区

C primer plus 练习题 第七章

1. 1 #include <stdio.h> 2 3 #define SPACE ' ' 4 #define NEWLINE '\n' 5 6 int main() 7 { 8 int spaces,newlines,others; 9 char ch; 10 spaces = newlines = others = 0; 11 while((ch=getchar())!= '#') 12 { 13 /* 14 if(ch == SPACE) 15 { 16 spaces++; 17 }el

ios练习题--第七期

#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //1.以下是身份证号,输出身份证人的性别,年龄 NSString *idCard=@"210423198809040427"; NSLog(@"身份证%@",idCard); NSRange NL; NL.location=6; NL.length=4; NSStr

PTA的Python练习题(七)

不知不觉一个星期过去了,继续从 第3章-12 求整数的位数及各位数字之和 开始做题 1. 我原来想用题目漏洞做题的,不过想想还是算了自己写个完整的: a=int(input()) b=len(str(a))-1 d=b+1 count=0 for i in range(0,d): c=a/(10**b) c=int(c) e=c-1 count=count+c a=a-10**e*c b=b-1 print('{} {}'.format(d,count)) 这道题的int类型是不能直接求位数的,

6、50道JAVA基础编程练习题跟答案

1 50道JAVA基础编程练习题 2 [程序1] 3 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 4 程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... 5 public class Prog1{ 6 public static void main(String[] args){ 7 int n = 10; 8 System.out.println("第"+n+

Stanford机器学习---第七讲. 机器学习系统设计

本文原始版本见http://blog.csdn.net/abcjennifer/article/details/7834256 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归.Octave Tutorial.Logistic Regression.Regularization.神经网络.机器学习系统设计.SVM(Support Vector Machines 支持向量机).聚类.降维.异常检测.大规模机器学习等章节.所有内容均来自Standford公开课mach

Linux第七周(10.18-10.25)学习笔记

一.学习目标 1. 了解常见的存储技术(RAM.ROM.磁盘.固态硬盘等) 2. 理解局部性原理 3. 理解缓存思想 4. 理解局部性原理和缓存思想在存储层次结构中的应用 5. 高速缓存的原理和应用 二.学习任务 1. 阅读教材,完成课后练习(书中有参考答案) 重点:6.2 6.3 6.4  6.8 6.9 6.10 6.11 6.12 6.13 2. 考核:练习题把数据变换一下 3. 实验:需要动手的到实验楼中练习一下 三.学习资源 1. 教材:第六章<存储器层次结构> 2. 课程资料:ht

DSP 第七章

http://www.docin.com/p-58901222.html 第七章 DFT离散傅里叶变换 离散对周期,连续对非周期. 连续频谱计算起来不方便,所以要考虑离散频谱. DFT是分析离散时间信号的. N点DFT中的N指的是在频域中采样个数是N个点. 对频域的等间隔采样相当于对时域做周期延拓.这两组是一对DFT.0<=n<=N-1 7.2 DFT的性质 周期性:时域x(n)和频域X(K)的周期都是N(由公式得到) 线性:定义得到 循环对称性:一个时间序列和它的周期延拓(延拓周期长度大于原