スタックは、挿入と削除を1つの位置でのみ実行することを制限するリストです。この位置は、スタックの上部と呼ばれるリストの終わりです。スタックの基本操作には、プッシュとポップがあります。前者は挿入で、後者は削除されます。
スタックはFIFOテーブルでもあります。
スタックには実装には2つのタイプがあります。1つは配列を使用することで、もう1つはリンクリストを使用することです。
パブリッククラスmyArrayStack <e> {private arraylist <e> list = new ArrayList <>(); public void push(e e){list.add(e); } public e pop(){return list.remove(list.size() - 1); } public e peek(){return list.get(list.size() - 1); } public boolean isempty(){return list.size()== 0; }} public class mylinkstack <e> {linkedlist <e> list = new linkedlist <>(); public void push(e e){list.addlast(e); } public e pop(){return list.removelast(); } public e peek(){return list.getLast(); } public boolean isempty(){return list.size()== 0; }}スタックアプリケーション
バランスシンボル
一連のコードが与えられた場合、このコードのブラケットが構文に準拠しているかどうかを確認します。
たとえば、[{()}]これは合法ですが、[{]}()は違法です。
以下はテストコードです。
public class balancesimbol {public boolean isbalance(string string){myarraystack <character> stack = new MyArrayStack <>(); char [] array = string.tochararray(); for(char ch:array){if( "{[(ch)> = 0){stack.push(ch);} else if("}]) "。indexof(ch)> = 0){if(ismatching(stack.peek()、ch)){stack.pop(); }}} return stack.isempty(); } private boolean ismatching(char peek、char ch){if((peek == '{' && ch == '}')||(peek == '[' && ch == ']')||(peek == '(' && ch == ')'){return true; } falseを返します。 } public static void main(string [] args){balancesimbol symbol = new Balancesimbol(); string string = "public static void main(string [] args){balancesimbol symbol = new Balancesimbol();}"; string string2 = "public static void main(string [] args){balancesimbol symbol = new Balancesimbol([);}]"; system.out.println(symbol.isbalance(string)); system.out.println(symbol.isbalance(string2)); }}接尾辞式
たとえば、次の入力は対応する結果を計算します。
3 + 2 + 3 * 2 =?
これにより、異なる計算順序で異なる結果が生成されます。計算結果が左から右に16である場合、計算結果が数学的優先度に応じて11の場合。
上記のInfix式が接尾辞式に変換される場合:
3 2 + 3 2 * +
接尾辞式を使用してこの式の値を計算するのは非常に簡単です。スタックを使用するだけです。
数字に遭遇したときはいつでも、数字をスタックに置きます。
オペレーターに遭遇するたびに、2つの要素がポップアップしてオペレーターに従って計算し、それらをスタックに置きます。
スタックをポップアップする唯一の要素は、計算結果です。
/***単純化されたバージョン、各オペランドは1つだけであり、文字列が合法であると仮定します*/public class postfixexpression {public static int calculate(string string){myarraystack <string> stack = new myarraystack <>(); char [] arr = string.tochararray(); for(char ch:arr){if( "0123456789" .indexof(ch)> = 0){stack.push(ch + ""); } else if( "+ - */"。indexof(ch)> = 0){int a = integer.parseint(stack.pop()); int b = integer.parseint(stack.pop()); if(ch == ' +'){stack.push((a + b) + ""); } else if(ch == ' - '){stack.push((a -b) + ""); } else if(ch == ' *'){stack.push((a * b) + ""); } else if(ch == ' /'){stack.push((a / b) + ""); }} return integer.parseint(stack.peek()); } public static void main(string [] args){system.out.println(calculate( "32+32*+")); }} Infix式を接尾辞式に変換します
式 +、 - 、 *、 /、()のみが実行されているとします。そして、表現は合法です。
a + b * c-(d * e + f) / g変換された接尾辞式は次のとおりです。
ABC * + de * f + g / -
Stack Infixを使用して接尾辞を変換する手順は次のとおりです。
import java.util.hashmap; import java.util.map; public class expressionswitch {private static map <character、integer> map = new hashmap <文字、integer>(); static {map.put( '+'、0); map.put( ' - '、1); map.put( '*'、2); map.put( '/'、3); map.put( '('、4);} private static char [] [] priority = {// current operator // + - */(/ * stack + */{'>'、 '>'、 '<'、 '<'、 '<'}、/ * top- */{'>'、 '>'、 '<' '< '>'、 '>'、 '<'}、/ * make/ */{'>'、 '>'、 '>'> '、'> '、' <'}、/ * character( */{' <'、' <'、' <'、' <'}、}、} string.tochararray(); stack = new myarraystack <> stack.push(ch); else if( ')' == ch){while &&!stmp = stack.pop(); Stack.Push(CH) } return builder.toString(); } private static boolean ispriorityhigh(char tmp、char ch){return priority [map.get(tmp)] [map.get(ch)] == '>'; } public static void main(string [] args){system.out.println(switch1( "a+b*c-(d*e+f)/g")); }}この記事を通して、みんながJava Stackの知識を習得したことを願っています。このウェブサイトへのご支援ありがとうございます!