码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-04-24 13:30:31      阅读:279      评论:0      收藏:0      [点我收藏+]

标签:lis   注意   程序   中序表达式   中序   char   字符   parent   练习题   

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

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

标签:lis   注意   程序   中序表达式   中序   char   字符   parent   练习题   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!