算法實例練習記錄——缺少左括號的括號補全中序表達式問題(JAVA實現)

 算法練習記錄——問題描述:

  •  編寫一段程序,給定一個缺少左括號的表達式,並打印出,補全括號之後的中序表達式。
  •  例如,給定輸入: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));
	}

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章