数据存储--栈

  常见的三种数据存储类型:栈、队列和优先队列。其不同于数组类型,类似有链表、数等。它们适用于数据库应用中作数据记录,方便作一些增删改,而本次所述的这三种,通常用作算法辅助工具。并且不像数组中是通过下标访问结构中的元素,这里对数据的访问时受限的,只可提供某个时刻的一个数据项。

  

  认识:栈类似于面试官手里不断接收到的应聘简历,在不考虑其他因素下,总是看到最上面的简历。栈包含三个基本操作: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 }

 

posted @ 2017-05-09 17:38  x_jingxin  阅读(494)  评论(0编辑  收藏  举报