算法第四版1.3节部分练习题答案

1.3.4 编写一个Stack的用例Parentheses,从标准输入中读取一个文本流并使用栈判定其中的括号是否配对完整。例如,对于[ ( ) ] { } { [ ( ) ( ) ] ( ) } 程序应该打印true,对于[ ( ] )则打印false。

public class Matching
{
    public static boolean isBalanced(String s)
    {
        LinkedListStack<Character> myStack = new LinkedListStack<Character>();
        for (int i = 0; i < s.length(); i++)
        {
            if(s.charAt(i)==‘[‘) myStack.push(s.charAt(i));
            if(s.charAt(i)==‘(‘) myStack.push(s.charAt(i));
            if(s.charAt(i)==‘{‘) myStack.push(s.charAt(i));

            if(s.charAt(i)==‘]‘)
            {
                if(myStack.isEmpty()) return false;
                if(myStack.pop()!=‘[‘) return false;
            }

            if(s.charAt(i)==‘)‘)
            {
                if(myStack.isEmpty()) return false;
                if(myStack.pop()!=‘(‘) return false;
            }

            if(s.charAt(i)==‘}‘)
            {
                if(myStack.isEmpty()) return false;
                if(myStack.pop()!=‘{‘) return false;
            }
        }
        return myStack.isEmpty();
    }

    public static void main(String[] args)
    {
        String s1="[()]{}{[()()]()}";
        String s2="[(])";
        System.out.println(Matching.isBalanced(s1));
        System.out.println(Matching.isBalanced(s2));
    }
}

1.3.4

1.3.5 启发:求整数的二进制表示时用“除2取余法”时要特别注意二进制的高位和低位,本例借用了栈的“先进后出”特性来确认高位和地位。

Stack<Integer> s = new Stack<Integer>();
while (n > 0)
{
   s.push(n % 2);
   n = n / 2;
}
while (!s.isEmpty())
    System.out.print(s.pop());

1.3.5

 1.3.9 编写一段程序,从标准输入得到一个缺少左括号的表达式并打印补全括号之后的中序表达式。例如,给定输入:1+2)*3-4)*5-6)))你的程序应该输入:((1+2)*((3-4)*(5-6)))

public class EX_1_3_9
{
    public static void main(String[] args)
    {
        LinkedListStack<String> dataStack = new LinkedListStack<String>(); // 数据栈
        LinkedListStack<String> operStack = new LinkedListStack<String>(); // 运算符栈

        String s = "1+2)*3-4)*5-6)))";

        // 该算法有个前提就是输入的字符串是正确的表达式

        for (int i = 0; i < s.length(); i++)
        {
            // 如果是操作符,则将其压入操作符栈
            if (s.charAt(i)==‘+‘ || s.charAt(i)==‘-‘ || s.charAt(i)==‘*‘ || s.charAt(i)==‘/‘)
            {
                operStack.push(String.valueOf(s.charAt(i)));
            }
            // 如果是右括号,则从数据栈中弹出两个数,从运算符栈中弹出一个运算符,补全左括号后,
            // 拼接为一个整体的字符串压入数据栈中
            else if (s.charAt(i)==‘)‘)
            {
                String oper = operStack.pop();
                String second = dataStack.pop();
                String first = dataStack.pop();
                String whole = ("(" + first + oper + second + ")");
                dataStack.push(whole);
            }
            // 如果是数据,则压入数据栈中
            else
            {
                dataStack.push(String.valueOf(s.charAt(i)));
            }
        }

        while(!dataStack.isEmpty())
        {
            System.out.print(dataStack.pop());
        }
    }
}

1.3.9

原文地址:https://www.cnblogs.com/yahuian/p/10745721.html

时间: 2024-11-05 16:01:51

算法第四版1.3节部分练习题答案的相关文章

算法第四版 在Eclipse中调用Algs4库

首先下载Eclipse,我选择的是Eclipse IDE for Java Developers64位版本,下载下来之后解压缩到喜欢的位置然后双击Eclipse.exe启动 然后开始新建项目,File -> New Java Project,项目名随便写,如下图 右键src文件夹,Add -> New Java Class,这里需要注意Name一栏里填写的内容就是类名,这里我写了TestAlgs4,为了测试「算法 第四版」作者给的那个测试样例 代码如下: import edu.princeto

算法(第四版)学习笔记之java实现选择排序

选择排序步骤: 1.找到数组中参与遍历比较的所有元素中的最小元素的下标: 2.将最小元素与数组中参与遍历比较的第一个元素进行交换(如果第一个元素就是最小元素的话,那么也会进行一次交换): 3.若数组中还有需要参与遍历比较的元素,则跳转到步骤1:否则排序结束. 在算法第四版中给出的所有排序均是适用于任意实现了Comparable接口的数据类型,若要将数字作为测试用例,请勿使用基本数据类型,改用Integer等实现了Comparable接口的对象. 选择排序代码如下: /** * * @author

算法第四版-文字版-下载地址-Robert Sedgewick

下载地址:https://download.csdn.net/download/moshenglv/10777447 算法第四版,文字版,可复制,方便copy代码 目录: 第1章 基 础 ....................... . ..........................11.1 基础编程模型 ..................................... 41.1.1 Java程序的基本结构 ................. 41.1.2原始数据类型与表达式

算法(第四版)之并查集(union-find算法)

开个新坑, 准备学习算法(第四版), 并把上面学到的东西写成博客, 毕竟以前也学过一点算法, 但效果甚微 并查集, 在这本书的第一章1.5中叫做union-find算法, 但在其他地方这个叫做并查集,就是说一系列点的连通问题,比如, 我们有十个点, 分别记作0~9: 加入我们要把2和4连接起来怎么表示呢? 首先我们会想到,给所有的点标上一个号, 来代表他们的连通关系, 我们初始化这个数就是他们id本身: 如果我们要连接2和4, 就使得4的id为2: 之后要连接间隔点任意两个点, 就把它们和它们相

算法第四版学习笔记之快速排序 QuickSort

软件:DrJava 参考书:算法(第四版) 章节:2.3快速排序(以下截图是算法配套视频所讲内容截图) 1:快速排序 2:

《算法:第四版》练习1.1部分答案

以下答案纯属个人愚见,作为IT新手,算法代码中难免有逻辑漏洞和其他不足之处,欢迎朋友你点评拍砖,交流争辩能极大开阔思维,愿一起加油进步!^_^ 1.1.19  在计算机上运行以下程序: 1 public class Fibonacci { 2 3 public static long F(int N) { 4 if(0 == N) 5 return 0; 6 if(1 == N) 7 return 1; 8 return F(N - 1) + F(N - 2); 9 } 10 11 public

算法第四版学习——Coursera&amp;DrJava使用方法

引言 前段时间失业了,找工作的时候最深的两点体会是: 1.虽然做过大项目,做过很多复杂业务功能,涉及过很多知识领域.但是都很难表达清楚. 2.笔试遇到很多算法题,做得都比较头疼(糟糕),很多都直接影响了面试结果. 第一点我明白是需要不断总结和积累的,第二点勾起了我对算法学习的兴趣.大学学算法的时候,脱离实践,只谈时间.空间复杂度和实现难度,学完了就忘了,那样枯燥的算法我肯定不想再碰一遍. 偶然看到了Coursera的算法导论课程,遇到了大牛老师Robert Sedgewick,他的视频在网上下下

在Windows上安装「算法 第四版」组件

这篇文档将向你介绍如何在Windows系统上安装本书将用到的Java开发环境,同时我们也提供了一个手把手的.使用我们提供的DrJava工具或者用命令行来创建.编译和运行你的第一个Java程序的手册,这个过程中用到的所有软件都可以自由下载 本操作指南适用于32位和64位的Windows 8.Windows 7.Vista SP1和XP SP3 —————— 0. 安装开发环境 —————— 我们提供的安装器将会自动下载.安装和配置你将用到的所有开发环境,包括Java SE 7.DrJava.教材库

算法(第四版)学习笔记之java实现快速排序

快速排序是一种分治的排序算法.它将一个数组分成两个子数组,将两部分独立地排序.快速排序和归并排序是互补的,归并排序将两个子数组分别排序,并将有序的子数组归并以将整个数组排序:而快速排序则是当两个子数组有序时整个数组也就自然有序了.在快速排序中,切分的位置取决于数组的内容. 优点: 1.实现简单: 2.适用于各种不同的输入数据且在一般应用中比其他排序算法都要快得多: 3.原地排序: 4.时间复杂度为o(nlgn); 5.内循环比大多数排序算法都要短,比较次数少. 缺点:快速排序算法非常脆弱,在实现