数据存储--栈
常见的三种数据存储类型:栈、队列和优先队列。其不同于数组类型,类似有链表、数等。它们适用于数据库应用中作数据记录,方便作一些增删改,而本次所述的这三种,通常用作算法辅助工具。并且不像数组中是通过下标访问结构中的元素,这里对数据的访问时受限的,只可提供某个时刻的一个数据项。
栈
认识:栈类似于面试官手里不断接收到的应聘简历,在不考虑其他因素下,总是看到最上面的简历。栈包含三个基本操作:push(入栈)、pop(出栈)、peek(查看)。
下面的例子,描述了类似于a(b(c))(d)e这样的字符串,检测括号是否匹配。
1 package com.test; 2 3 public class Test{ 4 public static void main(String[] args) { 5 6 String input = "aa(vv(cew)(ew))(w)"; 7 checker c = new checker(input); 8 c.check(); 9 10 } 11 } 12 13 /** 14 * 检测类 15 * @author jingxin 16 * 17 */ 18 class checker{ 19 private String input; 20 21 public checker(String in){ 22 input = in; 23 } 24 25 public void check(){ 26 stack s = new stack(input.length()); // 初始化栈 27 28 for (int i = 0; i < input.length(); i++) { 29 char ch = input.charAt(i); 30 switch(ch){ 31 case '{': // 开始标签 32 case '[': 33 case '(': 34 if(!s.isFull()){ 35 // 压入开始标签 36 s.push(ch); 37 } 38 break; 39 case '}': // 结束标签 40 case ']': 41 case ')': 42 if(!s.isEmpty()){ 43 // 取出开始标签 44 char chp = s.pop(); 45 if(ch=='}' && chp!='{' || 46 ch==']' && chp!='[' || 47 ch==')' && chp!='('){ 48 System.out.println("Error:"+ch+"在位置"+i+"上"); 49 } 50 51 }else{ 52 System.out.println("Error:"+ch+"在位置"+i+"上"); 53 } 54 break; 55 default: 56 break; 57 } 58 } 59 if(!s.isEmpty()){ 60 System.out.println("Error: 缺少正确的分隔符"); 61 } 62 63 } 64 65 } 66 67 68 69 /** 70 * 栈 71 * @author jingxin 72 * 73 */ 74 class stack { 75 76 private int maxSize; // 栈大小 77 private char[] stackArray; // 基于数组 78 private int top; // 栈顶位置 79 80 public stack(int s){ 81 maxSize = s; 82 stackArray = new char[maxSize]; 83 top = -1; // 空栈 84 } 85 86 // 入栈 87 public void push(char j){ 88 stackArray[++top] = j; // 先将指针向上移,再添加元素 89 } 90 91 // 出栈 92 public char pop(){ 93 return stackArray[top--]; // 先出栈,然后将指针下移 94 } 95 96 // 查看栈(只能查看栈顶的一个元素) 97 public char peek(){ 98 return stackArray[top]; 99 } 100 101 // 判断栈是否为空 102 public boolean isEmpty(){ 103 return (top == -1); 104 } 105 106 // 判断栈是否满了 107 public boolean isFull(){ 108 return (top == maxSize-1); 109 } 110 }