スタック:線形テーブルの一種であり、線形テーブルの一方の端での挿入および削除操作に制限されています。挿入と削除を許可する端をスタックの最上位と呼び、挿入と削除を許可しない端を
スタックの最下部と呼びます。スタックにはプッシュとポップの2つの簡単な操作しかありませんが、さらに多くのことを実現できます。複雑な効果。たとえば
、文字列 '{[()]}'の括弧が上記と一致するかどうかを確認します。
アイデアについて話しましょう:{、[、(が一致すると、スタックにプッシュされます。一致) 、]、}はスタック比較
コードの実装です
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int N = scan.nextInt();
String s;
for (int i = 0; i < N; i++) {
s = scan.next();
if (isMatch(s)) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
}
private static boolean isMatch(String s) {
Stack<Character> sk = new Stack<Character>();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') {
sk.push('(');
}
if (s.charAt(i) == ')') {
if (!sk.isEmpty() && sk.pop() == '(')
continue;
else
return false;
}
if (s.charAt(i) == '[') {
sk.push('[');
}
if (s.charAt(i) == ']') {
if (!sk.isEmpty() && sk.pop() == '[')
continue;
else
return false;
}
}
if (sk.isEmpty())
return true;
else
return false;
}
}
そして、コンピューターはこの式をどのように計算しますか?
1+(5 + 2)X6は、
我々は最初の5 + 2 = 7、その後、逓倍数7 * 6 = 42ブラケットを計算する必要があることを知って、そして最終的にはプラス42 + 1 = 43に署名。
のスタックを使用する方法高速計算?最初にいくつかのルールを作成します
- すべてのデジタル出力を直接
- オペレーターの優先順位は、スタックへのプッシュよりも高くなります。それ以外の場合は、優先順位が高いか同じであるすべての演算子をスタックから、または括弧までポップしてから、すべての演算子をスタックにプッシュします。
- 開き括弧はすべてスタックにプッシュされます
- 左括弧がスタックに含まれている場合、すべての演算子がスタックにプッシュされます
- 右括弧の場合、左括弧が一致するまでスタックが継続的にポップされます
これらのいくつかのルールの後、接尾辞式「152 + 6X +」を取得します。スタックを再度使用してスタック上の任意の数値をプッシュし、任意の演算子がスタックを2回ポップする
ため、152がスタックにプッシュされ、+記号が検出されます。スタックから2がポップされ、次に5がポップされます。スタックは7を取得するように操作され、結果はスタックにプッシュされます。次に、6もスタックにプッシュされ、X番号に遭遇すると、2回ポップされ、6がスタックからポップされ、
次に7がポップされて42を取得する操作が実行され、結果がスタックにプッシュされます。最後は+記号で、スタックは2回ポップされ、42が最初にポップされ、次にスタックが計算のためにポップされます。スタックは空で、最終結果は43です。