集合的理解

来源:互联网 发布:java 命令行参数 d 编辑:程序博客网 时间:2024/05/21 19:47

1、栈,队列在集合中的运用

栈,先进后出,,但是注意便利的时候,还是按照先进先出的概念便利输出

     在java中我们运用运用到栈的对象  ~~~~~~ statck  通过 push() 和 pop() 方法。

                                stack介绍 继承的父类是 Vector  vector继承的接口是List,而 vector是线程安全的,所以自然 statck也是线程安全的,所谓线程安全,便是在这个类的方法上  synchronized 上锁操作,及对这个方法的操作。部分代码展示

          public synchronized int capacity() {
        return elementData.length;
    }

    /**
     * Returns the number of components in this vector.
     *
     * @return  the number of components in this vector
     */
    public synchronized int size() {
        return elementCount;
    }

    /**
     * Tests if this vector has no components.
     *
     * @return  {@code true} if and only if this vector has
     *          no components, that is, its size is zero;
     *          {@code false} otherwise.
     */
    public synchronized boolean isEmpty() {
        return elementCount == 0;
    }


队列 ,先进先出,虽然说我们一般的遍历也可以实现这个功能,但是队列仍然有它的作用,如我们要删除第一个元素,并返回这个删除的元素,那我们最简单的操作,莫过于选择队列的   pop()方法

  在Java中运用 队列的操作对象有   LinkedList  集合   他不是线程安全的,继承的接口是 List




下面表示的是 运用 栈和队列实现  slr(1)文法判断


package jsu.java.compile;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Scanner;
import java.util.Stack;

public class lr {
    private static   Map<String ,String>map=new HashMap<String ,String>();
    private static   Map<Integer ,String[]>make=new HashMap<Integer ,String[]>();
    private static String array[][]={{"S'","S"},{"S","AB"},{"A","aBa"},{"A",""},{"B","bAb"},{"B",""}};
        static{
    
        map.put("0a","S3" );
        map.put("0b","r3" );
        map.put("0#","r3" );
        map.put("0S","1" );
        map.put("0A","2" );
    
        map.put("1#","acc" );
        
        map.put("2a","r5" );
        map.put("2b","S5" );
        map.put("2#","r5" );
        map.put("2B","4" );
        
        map.put("3a","r5" );
        map.put("3b","S5" );
        map.put("3#","r5" );
        map.put("3B","6" );
        
    
        map.put("4#","r1" );
        
        
        map.put("5a","S3" );
        map.put("5b","r3" );
        map.put("5#","r3" );
        map.put("5A","7" );
        
        map.put("6a","S8" );
        
    
        map.put("7b","S9" );
        
        map.put("8#","r2" );
        map.put("8b","r2" );
        
        map.put("9","r4" );
        map.put("9#","r4" );
        
        for(int t=0;t<array.length;t++){
            make.put(t, array[t]);
        }
    }
    
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        String str=scanner.next();
        if(str.endsWith("#")){
            for(int i=0;i<str.length()-1;i++){
                if(str.charAt(i)=='a' || str.charAt(i)=='b'  ){

                }
                else{
                    System.out.println("输入不合法");
                    System.exit(0);
                
                }
            }
            System.out.println("步骤 \t状态栈\t 符号栈\t 输入串\t动作 ");
            contro(str);
        }
        else{
            System.out.println("结尾以#号");
        }
    }

    private static void contro(String str) {
        Stack<Character>state=new Stack<Character>();
        state.add('0');
        
        Stack<Character>symble=new Stack<Character>();
        symble.add('#');
        LinkedList<Character>input=new LinkedList<Character>();//队列,先进先出

        for(int j=0;j<str.length();j++){
            input.add(str.charAt(j));
        }
        int i=0;
        while(true){
            
            
            System.out.print(i+1);
            i++;
            System.out.print("\t");
            //System.out.print(state.toString());
            for(Character c:state){  //便利是 按照先进先出的原则输出
                System.out.print(c);
            }
            System.out.print("\t");
            
            for(Character c:symble){  
                System.out.print(c); //便利是 按照先进先出的原则输出
            }
            System.out.print("\t");
            
            for(Character c:input){  //便利是 按照先进先出的原则输出
                System.out.print(c);
            }
            System.out.print("\t");
            
            Character pop = state.get(state.size()-1);
            Character charAt = input.get(0);
            String stateInput=pop.toString()+charAt;
            String result=null;
            try {
                 result = map.get(stateInput);
                
            
            
        
            if(result.equals("acc")){
                System.out.println("成功");
                break;
            }
            
             if(result !=null &&result.length()>0){
                if(result.charAt(0)=='S'){
                    System.out.println("移进");
                    state.push(result.charAt(1));
                    Character pop2 = input.pop();
                    symble.push(pop2);
                    
                }
                else{
                    Character two=result.charAt(1);
                    int two1=Integer.parseInt(two.toString());
                    String arr[]=make.get(two1);
                    int len=arr[1].length();
                    for(int ji=0;ji<len;ji++){
                        state.pop();   //利用栈的先进后出
                        symble.pop();   //利用栈的先进后出
                        
                    }
                    symble.push(arr[0].charAt(0));
                
                    Character in = state.get(state.size()-1);
                    String str1=in.toString()+arr[0].charAt(0);
                    state.push((map.get(str1).charAt(0)));
                    System.out.println("规约");
                }
            }
            else{
                System.out.println("报错");
            }
            }
                catch (Exception e) {
                     System.out.println("报错");
                     System.exit(0);
                }
        }
        
    }
}


0 0
原创粉丝点击