前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >算法之求String类型算数表达式的值 和 验证IP地址合法性

算法之求String类型算数表达式的值 和 验证IP地址合法性

原创
作者头像
CoffeeLand
修改于 2020-04-16 02:25:37
修改于 2020-04-16 02:25:37
68000
代码可运行
举报
文章被收录于专栏:CoffeeLandCoffeeLand
运行总次数:0
代码可运行

验证IP地址合法性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.apache.commons.validator.routines.InetAddressValidator;

public class IPValidator
{
    public static Boolean checkIpValid(String str)
    {
        // Get an InetAddressValidator
        InetAddressValidator validator = InetAddressValidator.getInstance();
        if (validator.isValidInet4Address(str) || validator.isValidInet6Address(str)) return true;
        return false;
    }

    public static void main(String[] args)
    {
        // an IPv4 address
          final String ipv4 = "10.8.9.28";

        // an IPv6 address
          final String ipv6 =
                "2001:0db8:85a3:0000:0000:8a2e:0370:7334";
        // Get an InetAddressValidator
        Boolean res4 = checkIpValid(ipv4);
        System.out.println("res4 = " + res4);
        Boolean res6 = checkIpValid(ipv6);
        System.out.println("res6 = " + res6);

    }
}

String类型算数表达式的值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.Stack;

class Calculator {

    final static Stack<Character> opStack = new Stack<>();

    /**
     * calculate the value of the suffix expression
     * @param expr - the input string expression
     * @return - result of the expression
     */
    public static int calc(String expr){
        // transfer the string format from infix to suffix
        String suffix = transferToSuffix(expr);
        Stack<Integer> resStack = new Stack<>();
        char[] arr = suffix.toCharArray();
        for(char ch : arr)
        {
            if (Character.isDigit(ch)) resStack.push(Integer.valueOf(ch - '0'));
            else resStack.push(calResWithOperation(ch, resStack.pop(), resStack.pop()));
        }
        return resStack.pop();
    }

    /**
     * transfer the string format from infix to suffix
     * @param expr - String in the form of infix
     * @return String in the form of suffix
     */
    private static String transferToSuffix(String expr){
        char[] arr = expr.replaceAll(" ","").toCharArray();
        int len = arr.length;
        String suffix = "";

        for(int i = 0; i < len; i++)
        {
            char ch = arr[i];
            // output if the char is number
            if(Character.isDigit(ch))
            {
                suffix+=ch;
                continue;
            }

            // push to the stack directly if char is '('
            if(ch == '(') {
                opStack.push(ch);
                continue;
            }

            if(ch == '+' || ch == '-'){
                while(!opStack.empty() && (opStack.peek() != '('))
                    suffix+= opStack.pop();
                opStack.push(ch);
                continue;
            }

            if(ch == '*' || ch == '/'){
                while(!opStack.empty() && (opStack.peek() == '*' || opStack.peek() == '/'))
                    suffix+= opStack.pop();
                opStack.push(ch);
                continue;
            }

            // pop the stack
            if(ch == ')'){
                while(!opStack.empty() && opStack.peek() != '(')
                    suffix += opStack.pop();
                opStack.pop();
                continue;
            }
        }

        while(!opStack.empty()) suffix += opStack.pop();
        return suffix;
    }

    /**
     * calculate the two numbers with operation
     *
     * @param op the operation symbol
     * @param num1 the calculated number
     * @param num2 the calculated number
     * @return the calculate result
     */
    private static int calResWithOperation(char op, int num1, int num2){
        if (op == '+') return num2 + num1;
        else if (op == '-') return num2 - num1;
        else if (op == '*') return num2 * num1;
        else if (op == '/') return num2 / num1;
        else return 0;
    }

      public static void main(String[] args){
        String exp = "1+2* (3+4)";
        String postfix = transferToSuffix(exp);
        System.out.println("postfix = " + postfix); // postfix = 1234+*+
        int res = calc(postfix);
        System.out.println("res = " + res);  // res = 15
    }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
表达式求值
本题主要考察对于数据结构栈的使用。我们可以定义两个栈,操作数栈和操作符号栈,依次扫描输入,处理结果。
用户7447819
2021/07/23
3710
实现栈的表达式的转化
针对利用python来解决数学问题,提出循环定义等方法,通过实践,证明该方法是有效的。此方法结合并熟练的运用所学的简单知识和简单的逻辑关系,当然方法还有不足或考虑不周的地方,还有待继续研究。
算法与编程之美
2023/08/22
1310
实现栈的表达式的转化
【练习】计算给定算数表达式的结果
给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。
孟君
2020/04/23
1.2K0
前缀、中缀、后缀表达式
它们都是对表达式的记法,因此也被称为前缀记法、中缀记法和后缀记法。它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前;中缀和后缀同理。 举例: (3 + 4) × 5 - 6 就是中缀表达式 - × + 3 4 5 6 前缀表达式 3 4 + 5 × 6 - 后缀表达式 中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间。中缀表达式是人们常用的算术表示方法。 虽然人的大脑很容易理解与分析中缀表达式,但对计算
_gongluck
2018/03/08
1.3K0
前缀、中缀、后缀表达式
在函数式编程语言中,为了表示方便,出现了一些新的语法格式。所谓前缀、中缀、后缀表达式,它们之间的区别在于运算符相对与操作数的位置不同,为了说明它们的概念,首先来看一下中缀表达式。 所谓中缀表达式,就是将函数名放到两个操作数中间的表达式,其中,左侧的操作数代表函数对象或值,右侧的操作数代表函数的参数值。例如: (3 + 4) × 5 - 6 就是中缀表达式 - × + 3 4 5 6 前缀表达式 3 4 + 5 × 6 - 后缀表达式 前缀表达式 前缀表达式又称为前缀记法、波兰式,主要用于表示运算符位于操作数
xiangzhihong
2018/02/08
1.2K0
数据结构与算法-(7)---栈的应用-(3)表达式转换
像 * 这种操作符( operator ) 介于操作数 ( operand )中间的表示法,称为 "中缀" 表示法.
ImAileen
2024/01/18
1750
数据结构与算法-(7)---栈的应用-(3)表达式转换
【数据结构】计算机底层是用什么识别算数表达式的?
请问: 计算机底层是如何运算得到结果的? 注意不是简单的把算式列出运算,因为我们看这个算式 7 * 2 * 2 - 5, 但是计算机怎么理解这个算式的(对计算机而言,它接收到的就是一个字符串),我们讨论的是这个问题。----> 栈
冷环渊
2021/12/29
3470
【数据结构】计算机底层是用什么识别算数表达式的?
利用栈实现中缀表达式计算
本题看似简单,实则不然,要实现这个功能我们不能简单的直接将这个字符串丢给程序 如下
切图仔
2022/09/14
5580
利用栈实现中缀表达式计算
c++计算中缀表达式:一个识别括号的简易计算器
point:用两个栈分别存数字和运算符,对于在栈内和在栈外的运算符,需要有两套优先级。 #include <iostream> #include <string> #include <stack> #include <map> using namespace std; class Solution { public: int to_postfix(string s) { int i = 0; stack<int> num; stack<
kalifa_lau
2018/04/27
8910
用栈来实现简易版中缀表达式的计算器
5.栈的使用场景: 1.递归 2.方法调用 3.表达式的转化和求值 4.二叉树遍历 5.图的深度优先遍历 6.逆序输出 如 单链表的反转
shengjk1
2020/02/20
4560
中缀表达式转后缀表达式并求值
1.什么是中缀表达式? 中缀表达式示例 2.什么是后缀表达式? 后缀表达式示例 3.代码 package xmht.datastructuresandalgorithms.datastructure.stack; import java.util.ArrayList; import java.util.List; import java.util.Stack; /** * @author shengjk1 * @date 2020/2/16 */ /* 仅仅适用于 int 类型计算 */ p
shengjk1
2020/02/21
5400
提高代码可读性的秘诀:注释的重要性
又是00后整顿职场的一段精彩演绎。不可置否,在实际的软件开发过程中,确实有很多开发人员依然不愿意写注释认为这会浪费时间,或者自认为他们的代码足够清晰,不需要额外的解释。但这种想法too young too simple,代码注释对于项目的质量和效率有着深远的影响,在软件开发中的重要性不容小觑。
努力的阿飞
2023/10/13
2410
中缀表达式转换为后缀表达式(逆波兰表达式)并对其求值
中缀表达式转后缀表达式思路: 1.初始化一个运算符栈s1和存储中间结果的List集合s2; 2.从左至右扫描中缀表达式(这里为了方便把中缀表达式字符串依次存放到数组中); 3.遇到操作数时,将其加到s2; 4.遇到运算符时,比较其与s1栈顶运算符的优先级: 4.1.若s1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈 4.2.若优先级比栈顶运算符优先级高,也将运算符压入s1; 4.3.否则,将s1栈顶的运算符弹出并加到s2中,再次回到4.1与s1中新的栈顶运算符相比较 5.遇到括号时: 5.1.若是左括号“(”,则直接压入s1; 5.2.若是右括号“)”,则依次弹出s1栈顶运算符并加入s2,直到遇左括号为止,此时将这一对括号丢弃; 6.重复2-5,直到表达式最右边 7.将s1中剩余的运算符依次弹出并加入到s2 8.依次输出s2中的元素,结果即为中缀表达式对应的后缀表达式。
技术交流
2022/11/18
4030
中缀表达式转换为后缀表达式(逆波兰表达式)并对其求值
前缀、中缀、后缀表达式「建议收藏」
关键字:概念, 前缀表达式, 前缀记法, 中缀表达式, 中缀记法, 波兰式, 后缀表达式, 后缀记法, 逆波兰式
全栈程序员站长
2022/07/05
2.1K0
Qz学算法-数据结构篇(表达式、递归)
从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素和次顶元素),并将结果入栈:重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果
浅辄
2023/06/09
2980
java数据结构和算法(二)
从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 和 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果
shaoshaossm
2022/12/26
3590
java数据结构和算法(二)
逆波兰表达式
本文是学习B站韩顺平老师的数据结构与算法课程的笔记。关于中缀表达式转逆波兰表达式的代码,和老师的不一样,自己按照思路实现的。思路比较清晰,如果看老师的代码有点懵逼的话,可以参考本文的代码,个人感觉还是非常容易理解的(初步测试通过,不敢保证没bug,若发现bug请留言,谢谢)。
贪挽懒月
2020/09/10
5540
中缀表达式转后缀表达式以及计算后缀表达式的值(C++)
1.中缀转后缀的要点 (1)遇到数字需要直接输出,但是有时数字可能不只是一个个位数,因此需要遍历表达式,获取该值。 (2)如果运算符栈为空,如果遇到运算符,直接入栈。 (3)如果遇到"(",直接入栈。 (4)如果遇到")",连续出栈,一直到栈顶元素是"(",然后出栈"("。 (5)如果遇到运算符且运算符栈不为空,此时需要比较当前运算符和栈顶运算符的优先级。分两种情况:1.当前运算符优先级大于栈顶运算符优先级,直接入栈。2.当前运算符优先小于栈顶运算符优先级,需要一直出栈,直到栈顶运算符优先小于当前运算符,将当前运算符入栈。
lexingsen
2022/02/24
1.4K0
表达式求值问题
   最近在学习表达式求值问题,想使用C++或C语言实现一个带圆括号的十进制正整数的表达式求值控制台程序。这个问题可以通过栈或者二叉树遍历来解决。记得以前在学校学习数据结构中栈的应用时看到过,另外编译原理这门课也有讲过。重新翻开<<数据结构-C语言描述 耿国华 主编>>一书的P80~P83第3张有关栈相应的章节时,有一个无括号算术表达式的求值问题,其次在对应的光盘上课程设计里头有表达式求值的相关描述,这里记录如下:
ccf19881030
2019/04/24
1.3K0
2022: 暴杀表达式, 脚踩逆波兰的时候到了
前缀表达式是一种没有括号的算术表达式,与中缀表达式不同的是,其将运算符写在前面,操作数写在后面。为纪念其发明者波兰数学家Jan Lukasiewicz,前缀表达式也称为“波兰式”。例如,- 1 + 2 3,它等价于1-(2+3)。
冷环渊
2022/01/04
7030
2022: 暴杀表达式, 脚踩逆波兰的时候到了
相关推荐
表达式求值
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验