第三に、スタック(スタック)
1、スタックの概念
スタックキューとは対照的に、キューは最初のチームに入力され、リストの線形尾のチーム、スタックは、スタックの一番上にのみ挿入と削除テーブルリニア(先入れ先出し)です。我々は通常、スタックの一端の挿入や削除がなり、もう一方の端がスタックの最下部と呼ばれることができます。スタックに挿入スタックは、スタックが削除操作をポップされ、スタックが空のスタックと呼ばれる任意のデータ要素が含まれていません。
スタックは言いました:
- アナログスタックのアレイを有します
- リンクリストを使用してスタックのシミュレーション
図2に示すように、アプリケーションシナリオのスタック
接頭辞、接尾辞と中置式
- 式には、かつてのオペレータの接頭辞、の文字数です
(3 + 4)* 5-6 ====> - * + 3 4 5 6
- 式の辞表現形式我々は通常のライト
(3 + 4)* 5-6
- 演算子の後のPostfix式、文字の最初の数、
(3 + 4)* 5-6 =====> 3 4 + 5 * 6
Postfixの中置式ターン
- (リストも表すことができる)スタックS2の2つのスタック、スタック演算子S1を初期化し、中間結果を格納します。
- 左から右の中置式にスキャン
- オペランド、S2に圧入され、検出されました
- 遭遇したオペレータは、トップ要素の優先順位と比較します:
- s1がnullの場合、またはスタックシンボルは「(」括弧を残した場合、オペレータは、直接プッシュします
- そうでない場合、スタックの優先度よりも高い優先度、スタックにオペレータS1
- そうでない場合は、ポップアップオペレータスタックS1及びS2は、サイクルを継続する第4工程でに押し込ま
- 遭遇した括弧:
それは左のブラケットが「(」S1に直接である場合
右括弧「)」、オペレータは順次取り出しS1スタック、およびS2に圧入した場合、それは括弧を左まで、括弧を捨てた時点で、検出されました。
- 右端の上記の手順は、式まで繰り返します
- 残りのオペレータはS1順次排出さS2を押下
- S2が順次ポップアップ要素とポストフィックス表記に対応する逆中置式の結果を出力します。
2.1四則式(アナログ演算器)
- 中置式の実施形態は、計算、中置式表現の「7 + 2 * 6-4」伝統的な形式を使用しています。
1、インデックスでインデックスの象徴的表現を見つけます
2、現在のシンボルは、デジタルにスタック上の数を指している場合であれば、スタック上のシンボルにシンボル
3、当index指向运算符时,若此时符号栈为空,直接入栈,若符号栈不为空,则比较index指向的符号与栈顶的符号的优先级,若index指向的运算符大于等于栈顶的运算符时,将index指向的运算符入栈,否则将数字栈中前两位运算符(num1、num2)出栈,符号栈中的栈顶指向的运算符出栈,运算后**(num2运算符num1)**放入数字栈中。
4、当表达式扫描完毕,就顺序的从数字栈和符号栈中pop出相应的数字和符号进行运算。
5、当数字栈中仅有一个元素时,就是表达式的值。
- 采用后缀表达式计算 9 3 1 -3 * +10 2 / +
1、通过一个index索引查找表达式的符号
2、若当前指向的符号为数字,就放入数字栈中,若是符号,就将处于栈顶的里两个数字出栈,并进行运算
3、将结算结果进栈,一直到最终获得结果。
2.2、递归
递归(recursion)是指通过重复将问题分解为同类的子问题而解决问题的方法。简单来说,递归就是自己调用自己。
递归需要遵守的规则:
1、执行一个方法时,就创建一个新的受保护的独立空间(栈空间)
2、方法的局部变量是独立的,不会互相影响
3、如果方法中使用的是引用类型的变量(比如数组),就会共享该引用类型的数据。
4、递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverFlowError
5、当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。
例子:
public static void getValue(int value){
if(value>2){
getValue(value-1);
}
System.out.println("the value is "+value);
}
递归的的经典算法
-
迷宫
描述:有一个迷宫地图,有一些可达的位置,也有一些不可达的位置(障碍、墙壁、边界)* 。从一个位置到下一个位置只能通过向上(或者向右、或者向下、或者向左)走一步来实现,从起点出发,如何找到一条到达终点的通路。
分析:
定义一个二维数组,1表示位置不可到达,2表示通路可以走,3表示位置已经走过,走不通,0表示还未走过的点 * 采用递归的算法 * 1、map表示地图 * 2、i,j表示从地图的那个位置开始出发(1,1) * 3、如果小球到map[i][j](终点)位置,则说明通路找到 * 4、策略:下->右->上->左(算法的优化是策略的变化)
-
八皇后问题
描述:在一个8*8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,共有多少种摆法?
分析:
1、第一个皇后放在第一行第一列 2、第二个皇后放在第二行第一列,然后判断是否Ok,如果不Ok,继续放在第二列、第三列,依次把所有列都放完,找到一个合适的 3、继续放第三个皇后,继续放第一列、第二列,.......直到第8个皇后放在一个不冲突的位置,这就算找到了一个正确解 4、当找到一个正确解时,在栈回退到上一个栈时,就会开始回溯,即将第一皇后放到第一列的所有正确解,全部得到 5、然后回头继续第一个皇后放第二列,后面继续执行1,2,3,4步骤 说明: 使用一个1维数组来表示,arr[8]={0,4,7,5,2,6,1,3},下标对应第几行,arr[i]=value,value表示第i+1个皇后放在第i+1列。