【LeetCode】150. 逆波兰表达式求值(ASCII码)

  今日学习的文章链接和视频链接

leetcode题目地址:150. 逆波兰表达式求值

 代码随想录题解地址:代码随想录

题目简介

即将后缀表达式转换成中缀表达式并计算。

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

看到题目的第一想法(可以贴代码)

1. 逆波兰表达式主要有以下两个优点:

  • 去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
  • 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。
public int evalRPN(String[] tokens) {
    Stack<String> st = new Stack<>();
    for (String i : tokens){
        if (i.charAt(0)>=48 && i.charAt(0)<=57 || i.charAt(0)=='-' && i.length() != 1){
            st.push(i);
        }else if (i.charAt(0)=='+'){
            int num1 = Integer.parseInt(st.pop());
            int num2 = Integer.parseInt(st.pop());
            int sum = num1 + num2;
            st.push(Integer.toString(sum));
        }else if (i.charAt(0)=='-' && i.length() == 1){
            int num1 = Integer.parseInt(st.pop());
            int num2 = Integer.parseInt(st.pop());
            int sum = num2 - num1;
            st.push(Integer.toString(sum));
        }else if (i.charAt(0)=='*'){
            int num1 = Integer.parseInt(st.pop());
            int num2 = Integer.parseInt(st.pop());
            int sum = num1 * num2;
            st.push(Integer.toString(sum));
        }else if (i.charAt(0)=='/'){
            int num1 = Integer.parseInt(st.pop());
            int num2 = Integer.parseInt(st.pop());  
            int sum = num2 / num1;
            st.push(Integer.toString(sum));
        }
    }
    return Integer.parseInt(st.pop());
}

实现过程中遇到哪些困难

看完代码随想录之后的想法

【解题思路】利用栈解,与我的一致,但用的是Deque。

【想法】

1. 好像一般都用Deque-LinkedList数据类型而不用Stack。

2. 先判定加减乘除更快。

看完视频自己写的ACC:

public int evalRPN(String[] tokens) {
    Deque<Integer> st = new LinkedList<>();
    for (String i : tokens){
        if (i.equals("+")){
            st.push(st.pop()+st.pop());
        }else if (i.equals("-")){
            st.push(-st.pop()+st.pop());
        }else if (i.equals("*")){
            st.push(st.pop()*st.pop());
        }else if (i.equals("/")){
            int temp1 = st.pop();
            int temp2 = st.pop();
            st.push(temp2/temp1);
        }else {
            st.push(Integer.valueOf(i));
        }
    }
    return st.pop();
}

学习时长


今日收获

1. ASCII码:

空格(32)

圆括号、加减乘除(40~47)

0~9(48~57)

A~B(65~90)

a~b(97~122)

2. String转char和int

 1 如何将字串 String 转换成整数 int ?
  • 1、 int i = Integer.parseInt([String]);
  • 2、 int i = Integer.valueOf(my_str).intValue();

注: 字串转成 Double, Float, Long 的方法大同小异.

2 如何将整数 int 转换成字串 String ?
  • 1、String s = String.valueOf(i);
  • 2、String s = Integer.toString(i);
  • 3、String s = "" + i;

 注: Double, Float, Long 转成字串的方法大同小异.

3. 关于String的加法

        String a = "12";

        String b = "13";

        System.out.println(a+b);        //输出1213而不是25

题目描述 根据逆波兰表示法求表达式的值。有效的算符包括+、-、*、/,每个运算对象可以是整数,也可以是另一个逆波兰表达式。假设给定的逆波兰表达式总是有效的,即表达式总会计算出有效数值且不存在除数为0的情况。其中,整数除法只保留整数部分。 PS:代填空 #include<iostream> #include<stdlib.h> #include<cstring> using namespace std; bool isNumber(char* token) {//判断token是否为操作数 //pdsu-c1 //pdsu-c1 } int evalRPN(char** tokens, int tokensSize) {//求逆波兰表达式的值 //pdsu-c2 //pdsu-c2 } int main() { char s[20][20]; char* tokens[20]; int res; //输入逆波兰表达式 int tokensSize = 0; do { cin >> s[tokensSize]; tokens[tokensSize] = s[tokensSize]; tokensSize++; } while (getchar() != '\n'); res = evalRPN(tokens, tokensSize); cout << "表达式值为:\n"; cout << res; } 输入描述 一行输入只包含数字和'+', '-', '*', '/'等字符。 注意,数字包括正数和负数,而且有可能不止一位数字,比如:-110。数字或者字符之间用空格隔开。 输出描述 输出必要的文字说明,主函数已经实现。 在新的一行,输出一个整数代表结果。 样例输入 2 1 + 3 * 样例输出 表达式值为: 9 代填空: #include<iostream> #include<stdlib.h> #include<cstring> using namespace std; bool isNumber(char* token) {//判断token是否为操作数 //pdsu-c1 //pdsu-c1 } int evalRPN(char** tokens, int tokensSize) {//求逆波兰表达式的值 //pdsu-c2 //pdsu-c2 } int main() { char s[20][20]; char* tokens[20]; int res; //输入逆波兰表达式 int tokensSize = 0; do { cin >> s[tokensSize]; tokens[tokensSize] = s[tokensSize]; tokensSize++; } while (getchar() != '\n'); res = evalRPN(tokens, tokensSize); cout << "表达式值为:\n"; cout << res; } 提示 输入:tokens=["10","6","9","3","+","-11","*","/","*","17","+","5","+"] 输出:22解释:该算式转化为常见的中缀表达式(10*(6/(9+3)*-11))+17)+5 =(10*(6/(12*-11))+17)+5 =(10*(6/-132)+17)+5 =(10*0)+17)+5 =(0+17)+5 =17+5 =22
10-25
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值