zoukankan      html  css  js  c++  java
  • Java数据类型Stack栈、Queue队列、数组队列和循环队列的比较

    判断括号是否匹配:调用java本身

    import java.util.Stack;
    public class Solution {
       public boolean isValid(String s){
    	   Stack<Character> stack=new Stack<>();
    	   for(int i=0;i<s.length();i++){
    		   char c=s.charAt(i);
    		   if(c=='('||c=='['||c=='{')
    			   stack.push(c);
    		   else{
    			   if(stack.empty())
    				   return false;
    			   char topChar=stack.pop();
    			   if(c==')'&&topChar!='(')
    				   return false;
    			   if(c==']'&&topChar!='[')
    				   return false;
    			   if(c=='}'&&topChar!='{')
    				   return false;
    		   }
    	   }
    	   return stack.empty();
       }
       public static void main(String[] args){
    	   System.out.println(
    			   (new Solution()).isValid("(){}[]"));
    	   System.out.println(
    			   (new Solution()).isValid("([)]"));
       }
    }
    

      调用自己写的:

    接口:

    public interface Stack<E> {
        int getSize();
        boolean isEmpty();
        void push(E e);
        E pop();
        E peek();
    }
    

      实现方法:

    public class ArrayStack<E> implements Stack<E> {
        Array<E> array;
        public ArrayStack(int capacity){
        	array=new Array<>(capacity);
        }
        public ArrayStack(){
        	array=new Array<>();
        }
        @Override
        public int getSize(){
        	return array.getSize();
        }
        @Override
        public boolean isEmpty(){
        	return array.isEmpty();
        }
        public int getCapacity(){
        	return array.getCapacity();
        }
        @Override
        public void push(E e){
        	array.addLast(e);
        }
        @Override
        public E pop(){
        	return array.removeLast();
        }
        @Override
        public E peek(){
        	return array.getLast();
        }
        @Override
        public String toString(){
        	StringBuilder res=new StringBuilder();
        	res.append("Stack:");
        	res.append("[");
        	for(int i=0;i<array.getSize();i++){
        		res.append(array.get(i));
        		if(i!=array.getSize()-1)//最后一个元素
        			res.append(",");
        	}
        	res.append("] top");
        	return res.toString();
        }
    }
    

      队列也是一种线性结构

    相比数组,队列对应的操作是数组的子集

    只能从一端(队尾)添加元素,只能从另一端(队首)取出元素

    public class ArrayQueue<E> implements Queue<E> {
         private Array<E> array;
         public ArrayQueue(int capacity){
        	array=new Array<>(capacity); 
         }
         public ArrayQueue(){
        	 array=new Array<>();
         }
         @Override
         public int getSize(){
        	 return array.getSize();
         }
         @Override
         public boolean isEmpty(){
        	 return array.isEmpty();
         }
         public int getCapacity(){
        	 return array.getCapacity();
         }
         @Override
         public void enqueue(E e){
        	array.addLast(e); 
         }
         @Override
         public E dequeue(){
        	 return array.removeFirst();
         }
         @Override
         public E getFront(){
        	 return array.getFirst();
         }
         @Override
         public String toString(){
        	 StringBuilder res=new StringBuilder();
     		res.append("Queue:");
     		res.append("front [");
     		for(int i=0;i<array.getSize();i++){
     			res.append(array.get(i));
     			if(i!=array.getSize()-1)//判断是否是最后一个元素
     				res.append(", ");
     		}
     		res.append("] tail");
     		return res.toString();
         }
         
         public static void main(String[] args){
        	 ArrayQueue<Integer> queue=new ArrayQueue<>();
        	 for (int i=0;i<10;i++){
        		 queue.enqueue(i);
        		 System.out.println(queue);
        		 
        		 if(i%3==2){
        			 queue.dequeue();
        			 System.out.println(queue);
        		 }
        	 }
         }
    }
    

      

    循环队列:

    public class LoopQueue<E> implements Queue<E>{
    	private E[] data;
    	private int front,tail;
        private int size;
        
        public LoopQueue(int capacity){
        	data=(E[])new Object[capacity+1];
        	front=0;
        	tail=0;
        	size=0;
        }
        public LoopQueue(){
        	this(10);
        }
        //浪费一个元素
        public int getCapacity(){
        	return data.length-1;
        }
        @Override
        public boolean isEmpty(){
        	return front==tail;
        }
        @Override
        public int getSize(){
        	return size;
        }
        @Override
        public void enqueue(E e){
        	//判断队列是否满
        	if((tail+1)%data.length==front)
        		resize(getCapacity()*2);
        	
        	data[tail]=e;
        	tail=(tail+1)%data.length;
        	size++;
        }
        @Override
        public E dequeue(){
        	if(isEmpty())
        		throw new IllegalArgumentException("Cannot dequeue from an empty queue.");
        	E ret=data[front];
        	data[front]=null;
        	front=(front+1)%data.length;
        	size--;
        	if(size==getCapacity()/4&&getCapacity()/2!=0)
        		resize(getCapacity()/2);
        	return ret;
        }
        @Override
        public E getFront(){
        	if(isEmpty())
        		throw new IllegalArgumentException("Cannot dequeue from an empty queue.");
        	return data[front];
        }
        private void resize(int newCapacity){
        	E[] newData=(E[])new Object[newCapacity+1];
        	for(int i=0;i<size;i++){
        		newData[i]=data[(i+front)%data.length];
        	}
        	data=newData;
        	front=0;
        	tail=size;
        }
        @Override
        public String toString(){
        	StringBuilder res=new StringBuilder();
    		res.append(String.format("Queue:size=%d,capacity=%d
    ", size,getCapacity()));
    		res.append("front [");
    		for(int i=front;i!=tail;i=(i+1)%data.length){
    			res.append(data[i]);
    			if((i+1)%data.length!=tail)//判断是否是最后一个元素
    				res.append(", ");
    		}
    		res.append("] tail");
    		return res.toString();
        }
        
        public static void main(String[] args){
       	 LoopQueue<Integer> queue=new LoopQueue<>();
       	 for (int i=0;i<10;i++){
       		 queue.enqueue(i);
       		 System.out.println(queue);
       		 
       		 if(i%3==2){
       			 queue.dequeue();
       			 System.out.println(queue);
       		 }
       	 }
        }
    }
    

      

    public class Main {
    	//测试使用q运行opCount个enqueueu和dequeue操作所需要的时间,单位 秒
    	private static double testQueue(Queue<Integer> q,int opCout){
          long startTime=System.nanoTime();
          Random random=new Random();
          
          for( int i=0;i<opCout;i++){
        	  q.enqueue(random.nextInt(Integer.MAX_VALUE));
          }
          for(int i=0;i<opCout;i++){
        	  q.dequeue();
          }
          long endTime=System.nanoTime();
          return (endTime-startTime)/1000000000.0;
    	}
    	public static void main(String[] args){
    		int opCount=100000;
    		ArrayQueue<Integer> arrayQueue=new ArrayQueue<>();
    		double time1=testQueue(arrayQueue, opCount);
    		System.out.println("ArrayQueue,time: "+time1+" s");
    		
    		LoopQueue<Integer> loopQueue=new LoopQueue<>();
    		double time2=testQueue(loopQueue, opCount);
    		System.out.println("ArrayQueue,time: "+time2+" s");
    	}	 
    }
    

     

  • 相关阅读:
    loaded some nib but the view outlet was not set
    指标评比
    IOS DEVELOP FOR DUMMIES
    软件测试题二
    javascript select
    DOM节点类型详解
    mysql操作
    UVA 10055
    solutions for 'No Suitable Driver Found For Jdbc'
    解决git中文乱码问题
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/10549003.html
Copyright © 2011-2022 走看看