1. 程式人生 > >算法第四版1.3節部分練習題答案

算法第四版1.3節部分練習題答案

ati lean lis balanced bool close ise lists eof

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節部分練習題答案