前言
前面的一文中,说明了什么是栈,以及栈的两种实现方式。接下来我们简单看看栈的经典的
应用。
栈的应用举例
栈的操作是十分有效的,是以常数时间运行的。有一种观念认为栈可能是计算机科学中除了
数组之外的最基本的数据结构了。那么栈到底有哪些运用呢?
Tips:下面的实现都是基于前面文章中的栈的数组的方式来进行实现的。
http://blog.csdn.net/kiritor/article/details/8867149
1、十进制正整数N进制
/*其实这里略有问题的 * 例如16进制的表示 * 14进制的表示 * 若14进制数为124:无法确定其具体是什么*/ public static String conversion(int num, int n) { Stack<Integer> myStack = new ArrayStack<Integer>(); Integer result = num; while (true) { // 将余数入栈 myStack.push(result % n); result = result / n; if (result == 0) { break; } } StringBuilder sb = new StringBuilder(); // 按出栈的顺序倒序排列即可 while ((result = myStack.pop()) != null) { sb.append(result); } return sb.toString(); }
2、平衡符号的判断
匹配思想是: 1、首先读入字符串保存在字符数组中
2、依次判断每个字符,如果是开放字符则压入栈中
3、如果是关闭字符而且此时栈为空的话,那么字符串非平衡串,否则栈顶元素弹出
并与该字符进行比较若能够成对匹配则继续,否则非平衡串。
4、在字符数组结尾处,如果栈非空则非平衡串,反之则是。
/*提取去需要检查的序列*/ public static String strFilter(String string) { StringBuffer sb = new StringBuffer(); char[] chars = string.toCharArray(); for(char c:chars) if(c=='['||c=='{'||c=='('||c==']'||c=='}'||c==')') sb.append(c); return sb.toString(); } public static boolean isMatch(String str) { Stack<Character> myStack = new ArrayStack<Character>(); char[] arr = strFilter(str).toCharArray(); System.out.println(strFilter(str)); for (char c : arr) { Character temp = myStack.pop(); // 栈为空时只将c入栈 if (temp == null) { myStack.push(c); } // 配对时c不入栈 else if (temp == '[' && c == ']') { } // 配对时c不入栈 else if (temp == '(' && c == ')') { } else if (temp == '{' && c == '}') { } // 不配对时c入栈 else { myStack.push(temp); myStack.push(c); } } return myStack.isEmpty(); }
测试代码:
String str = "sdfsdf{5*{2+5*(4+6)}}sdf"; System.out.println(isMatch(str));
运行结果:
3、行编辑器
输入行中字符‘#’表示退格'@'表示前面的输入无效
来看实现方式吧
public static String lineEdit(String input) { Stack<Character> myStack = new ArrayStack<Character>(); char[] arr = input.toCharArray(); for (char c : arr) { if (c == '#') { myStack.pop(); } else if (c == '@') { myStack.clear(); } else { myStack.push(c); } } return myStack.toString(); }
测试代码:
public static void main(String[] args) { System.out.println(conversion(10, 2)); System.out.println(lineEdit("你好!#你好啊@哈哈")); }
输出结果:
4、中缀表达式转后缀表达式
Tips:后缀表示具有一个优点:没有必要知道各个运算符号的优先级情况。
private static String infixToSuffix(String infix) { Stack< Character> stack = new Stack< Character>(); String suffix = ""; int length = infix.length(); for (int i = 0; i < length; i++) { Character temp; char c = infix.charAt(i); switch (c) { // 忽略空格 case ' ': break; // 碰到'(',push到栈 case '(': stack.push(c); break; // 碰到'+''-',将栈中所有运算符弹出,送到输出队列中 case '+': case '-': while (stack.size() != 0) { temp = stack.pop(); if (temp == '(') { stack.push('('); break; } suffix += " " + temp; } stack.push(c); suffix += " "; break; // 碰到'*''/',将栈中所有乘除运算符弹出,送到输出队列中 case '*': case '/': while (stack.size() != 0) { temp = stack.pop(); if (temp == '(' || temp == '+' || temp == '-') { stack.push(temp); break; } else { suffix += " " + temp; } } stack.push(c); suffix += " "; break; // 碰到右括号,将靠近栈顶的第一个左括号上面的运算符全部依次弹出,送至输出队列后,再丢弃左括号 case ')': while (stack.size() != 0) { temp = stack.pop(); if (temp == '(') break; else suffix += " " + temp; } //suffix += " "; break; default: suffix += c; } } while (stack.size() != 0) suffix += " " + stack.pop(); return suffix; } public static void main(String args[]){ System.out.println(infixToSuffix("3+(2-5)*6/3")); }
结果为:
以上4中就是栈的基本应用了。
转载于:https://blog.51cto.com/kiritor/1226682