算法練習記錄——問題描述:
- 編寫一段程序,給定一個缺少左括號的表達式,並打印出,補全括號之後的中序表達式。
- 例如,給定輸入:1 + 2 ) * 3 - 4 ) * 5 - 6 ) ) )
- 你的程序應該輸出:( ( 1 + 2 ) * ( ( 3 - 4 ) * ( 5 - 6 ) ) )
自己的一些感悟:
1、 題目本身可能沒什麼難度,重點在於如何思考出棧入棧的方式。一開始我考慮的是單個字符char的獲取--->入棧--->出棧--->組成中序表達式,但這樣會出現一個問題,就是當表達式複雜之後,無法進行回溯,在表達式的開頭追加左括號。
2、後來在網上看了別人的思路,才知道要將 數字符號 和 操作符符號 進行,分別存儲入棧,而且最重要的是一定要用 字符串String 這樣就可以避免,上面的問題了。因爲可以將一個 中序表達式——字符串,當作一個Stack的對象,來進行入棧和出棧操作。
3、在編程過程中:
-
解決了如何去除 初始字符串 中的 空格字符 問題——直接忽略,不進行入棧操作。
-
解決了 兩位以上數字時 將它們作爲一個整體進行入棧、出棧的問題——字符串的 contains(string s) 方法。
具體的代碼分析,都在代碼中了。
import java.util.Stack;
/*
* 編寫一段程序,給定一個缺少左括號的表達式,並打印出,補全括號之後的中序表達式。
* 例如,給定輸入:1 + 2 ) * 3 - 4 ) * 5 - 6 ) ) )
* 你的程序應該輸出:( ( 1 + 2 ) * ( ( 3 - 4 ) * ( 5 - 6 ) ) )
*/
//一個Stack實現,三個String字符串輔助完成。
/*
* 感覺好複雜,大致思路如下:
* 1、將操作數——0,1,2,3,4,5,6,7,8,9 和 符號——+,-,*,/ ,) 分別存儲在兩個字符串中,方便進行入棧處理,
* 2、String one 負責存儲 操作數,String operator 負責存儲 符號,分別進行入棧(stack)操作,
* 3、 當入棧(stack)符號裏出現 ) 右括號時,進行 中序表達式 的組合——出棧 4個 字符串,
* 4、然後在最左邊添加上 ( 左括號,將組合後的 中序表達式 存儲進新的String endstr 中,然後重新入棧(strack)中,最爲一個stack對象,
* 5、重複以上2,3,4步驟,指導整個給定的字符串遍歷結束。
*/
/*
* 舉例:給定字符串—— 4-2)/9-8) 求中序表達式結果,stack中的變化情況如下:
* [4]
* [4, -]
* [4, -, 2]
* [4, -, 2, )]
* [(4-2)]
* [(4-2), /]
* [(4-2), /, 9]
* [(4-2), /, 9, -]
* [(4-2), /, 9, -, 8]
* [(4-2), /, 9, -, 8, )]
* [(4-2), /, (9-8)]
* [(4-2)/(9-8)]
*/
public class CompleteParenthesesOne {
//整個程序用到的唯一一個棧
private Stack<String> stack;
CompleteParenthesesOne(){
stack=new Stack<String>();
}
public String completeParenthesesOne(String str) {
//存儲 數字0-9
String one=new String();
//存儲 +-*/)這些符號
String operator=new String();
//存儲中序表達式的結果,並進行入棧。
String endstr=new String();
//用來匹配 原字符串 第i個位置上,取到的字符 是不是 數字符號。
String nums="0123456789";
for(int i=0; i<str.length(); i++) {
//去除原字符串中的空格
if(str.substring(i,i+1).equals(" ")){
continue;
}
//判定是不是 數字 字符,是的話就繼續取下一個,直到出現 符號 字符。
//避免 兩位 以上的操作數時,中序表達式,組合時出現問題。
if(nums.contains(str.substring(i,i+1)))
{
one=one+str.substring(i, i+1);
continue;
}
else
{
if(one!="") {
stack.push(one);
//System.out.println(stack.toString());
}
operator=str.substring(i,i+1);
stack.push(operator);
}
//System.out.println(stack.toString());
//開始進行 中序表達式 的組合工作,每4個stack對象爲一組,進行出棧組合。
if(operator.equals(")")) {
for(int j=0; j<4; j++) {
endstr=stack.pop()+endstr;
}
endstr="("+endstr;
stack.push(endstr);
endstr="";
//System.out.println(stack.toString());
}
one="";
}
while(!stack.isEmpty()) {
endstr=stack.pop()+endstr;
}
return endstr;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
CompleteParenthesesOne cpone=new CompleteParenthesesOne();
String str="4-2)/5+2)*6-10))";
System.out.println(cpone.completeParenthesesOne(str));
String str1="4-2)/9-8)";
System.out.println(cpone.completeParenthesesOne(str1));
String str2=" 1 + 2 ) * 3 - 4 ) * 5 - 6 ) ) )";
System.out.println(cpone.completeParenthesesOne(str2));
}
}