1. 程式人生 > >數據結構之中序遍歷轉興許遍歷(JAVA實現)(二)

數據結構之中序遍歷轉興許遍歷(JAVA實現)(二)

百度 empty 表達 pty 中序 tor opera lin sem

算法流程:

主要分為四步:

1.當前字符為數字或者字母,則直接輸出

2.當前字符為)。則在棧中匹配輸出。一直匹配到),則停止輸出(就是將)及其頂上的元素所有彈出來輸出)

3.當前字符為操作符。則比較當前字符的入棧優先級(icp)和字符棧內優先級(isp)。假設icp<=isp,則將棧內操作符彈出輸出,然後反復3

4.當前字符為空,則將棧中元素依次彈出輸出

百度百科上面的描寫敘述:

1、建立運算符棧stackOperator用於運算符的存儲。壓入‘\0‘。
2、預處理表達式,正、負號前加0(假設一個加號(減號)出如今最前面或左括號後面,則該加號(減號)為正負號) 。
3、順序掃描表達式。假設當前字符是數字(優先級為0的符號),則直接輸出該數字。假設當前字符為運算符或括號(優先級不為0的符號)。則推斷第4點 。
4、若當前運算符為‘(‘,直接入棧;若為‘)‘,出棧並順序輸出運算符直到遇到第一個‘(‘。遇到的第一個‘(‘出棧但不輸出;若為四則運算符,比較棧頂元素與當前元素的優先級:假設 棧頂元素運算符優先級 >= 當前元素的優先級,出棧並順序輸出運算符直到 棧頂元素優先級 < 當前元素優先級。然後當前元素入棧;假設 棧頂元素 < 當前元素,直接入棧。
5、反復第3點直到表達式掃描完成。
6、順序出棧並輸出運算符直到棧頂元素為‘\0‘。


當然我自己理解的就是依照自己實現的簡單變化,沒有包含大括號

我的代碼:

	// 中序遍歷改為興許遍歷
		public String tranform(String obj)
			{
				Stack<Character> stack = new Stack<Character>();
				String obj2 = "";
				for (int i = 0; i < obj.length(); i++)
					{
						char ch = obj.charAt(i);
						if (Character.isLetter(ch))// 字母或數字直接輸出
							{
								obj2 += ch;
								System.out.println(ch);
							} else if (ch == ')')// 在棧中一致匹配到)操作符才停止出棧
							{
								char temp;
								while ((temp = stack.pop()) != '(')
									{
										obj2 += temp;
										System.out.println(temp);
									}
							} else
							// 比較操作符的進棧優先級
							{
								if(stack.isEmpty())
									{
										stack.push(ch);
										continue;
									}
								char temp = stack.peek();
								while (icp(ch) <= isp(temp))//進棧優先級小於棧內優先級,則一直出棧
									{
										System.out.println(temp);
										obj2+=temp;
                                                                                stack.pop();
                                                                                if(stack.isEmpty())break;
                                                                                temp=stack.peek();                                      
									}
								stack.push(ch);
							}
					}
				//將棧中剩余的元素彈出來
				while(!stack.isEmpty())
					{
						char temp=stack.pop();
						obj2+=temp;
						System.out.println(temp);
					}
				return obj2;
			}

		// 操作符在棧內的優先級
		private int isp(char ch)
			{
				switch (ch)
					{
					case '+':
					case '-':
						return 2;
					case '*':
					case '/':
						return 4;
					case ')':
						return 7;
					case '(':
						return 1;
					default:
						break;
					}
				return 0;
			}

		// 操作符進棧的優先級優先級
		private static int icp(char ch)
			{
				switch (ch)
					{
					case '+':
					case '-':
						return 3;
					case '*':
					case '/':
						return 5;
					case ')':
						return 1;
					case '(':
						return 7;
					default:
						break;
					}
				return 0;
			}

		public static void main(String[] args)
			{
				String objString="a*(b+c)+c/d";
				TreeNode<Character> treeNode=new TreeNode<Character>(null);
				treeNode.tranform(objString);

			}
執行效果:

a*(b+c)+c/d   -》 abc+*cd/*

假設利用這個後序遍歷非常easy實現一個簡單的計算器,除此之外,我記得一個基於文法的計算器,等下一次實現。

數據結構之中序遍歷轉興許遍歷(JAVA實現)(二)