Стек представляет собой список, который ограничивает вставку и удаление для выполнения только в одной позиции. Эта позиция - конец списка, называемый верхней частью стека. Для основных операций стека есть толчок и поп. Первый вставка, а последний удаляется.
Стек также является таблицей FIFO.
Существует два типа реализаций стеков, один из них - использовать массивы, а другой - использовать связанные списки.
открытый класс 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; }} открытый класс 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 Balancesymbol {public Boolean Isbalance (String String) {myarrayStack <marly> Stack = new MyarrayStack <> (); char [] array = string.thararray (); for (char ch: array) {if ("{[". }}} 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) {balancesymbol Symbol = new BalancesyMbol (); String string = "public static void main (string [] args) {balancesymbol Symbol = new BalancesyMbol ();}"; String string2 = "public static void main (string [] args) {balancesymbol Symbol = new Balancesymbol ([);}]"; System.out.println (symbol.isbalance (String)); System.out.println (symbol.isbalance (String2)); }} Выражение суффикса
Например, следующий вход вычисляет соответствующий результат,
3 + 2 + 3 * 2 =?
Это даст разные результаты в разных порядка расчета. Если результат расчета составляет 16 слева направо, и если результат расчета составляет 11 в соответствии с математическим приоритетом.
Если вышеупомянутое выражение инфикса преобразуется в выражение суффикса:
3 2 + 3 2 * +
Было бы очень просто рассчитать значение этого выражения, используя суффиксное выражение, просто используйте стек.
Всякий раз, когда встречается число, поместите номер в стеке.
Всякий раз, когда встречается оператор, для расчета оператора появляются два элемента, а затем поместите их в стек.
Единственный элемент, который появляется в стеке, - это результат расчета.
/*** Упрощенная версия, каждый операнд - это только один, и предполагая, что строка является законной*/открытый класс PostFixexPression {public Static Int Canculate (String String) {myarrayStack <string> Stack = new MyArrayStack <> (); char [] arr = string.thararray (); 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*+")); }} Преобразовать экспрессию инфикса в суффикс
Предположим, что только выражения +, -, *, /, () запускаются. И выражение является законным.
a + b * c - (d * e + f) / g Конвертированное выражение суффикса следующее:
ABC * + de * f + g / -
Шаги для использования Infix стека для преобразования суффиксов следующие:
Импорт java.util.hashmap; import java.util.map; открытый класс ExpressionWitch {частная статическая карта <символ, целое число> map = new Hashmap <символ, Integer> (); static {map.put ('+', 0); map.put ('-', 1); map.put ('*', 2); map.put ('/', 3); map.put ('(', 4);} private static char [] [] privation = {// текущий оператор // + - */(/ * стек + */{'>', '>', '<', '<', '<'},/ * top- */{'>', '>', ',', '<' ',/ * top '>', '<'},/ * Make/ */{'>', '>', '>', '>', '<'},/ * символ ( */{'<', '<', '<', '<', '<' '},}; public Static String Switch1 (String String) {StringBuilder builder = new StringBuilder (); Myarraystack <marly> stach = new myarraystack <> (); == CH) {while (true &&! Stack.isempty ()) {char tmp = Stack.pop (); (IspriorityHigh (TMP, CH)) {Builder.Append (stack.pop ()); } return Builder.toString (); } Частный статический логический 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. Спасибо за поддержку этого сайта!