• java-栈和队列-算法


    1,栈的实现

    1.1 栈-链表实现

    //定义Node类
    
    public class Node {
        public String data="";
        Node next=null;
    
        public Node(){
            data="THE-HEAD";
        }
        public Node(String data){
            this.data=data;
        }
    }
    View Code
    //基础
    //空?
    //长度-用成员变量表示
    
    //操作
    //入栈
    //出栈
    //返回栈顶元素
    
    //遍历
    
    
    public class LinkedStack {
        private int length=0;
        private Node head=new Node();
    
        //空?
        public boolean isEmpty(){
            if(length==0)
                return true;
            else
                return false;
        }
        //入栈
        public void push(String data){
            Node newNode=new Node(data);
            newNode.next=head.next;
            head.next=newNode;
            length++;
        }
        //出栈
        public String pop(){
            if(length==0){
                System.out.println("栈空,无法出栈");
                return "ERROR-emptyStack";
            }else{
                Node p=head.next;
                head.next=p.next;
                length--;
                return p.data;
            }
        }
        //返回栈顶元素
        public String getTop(){
            if(length==0){
                System.out.println("栈空,无法返回");
                return null;
            }else{
                return head.next.data;
            }
        }
        //遍历
        public void print(){
            if(length==0)
                System.out.println("栈空,无输出");
            else{
                System.out.print("栈: ");
                Node p=head;
                while(p.next!=null){
                    p=p.next;
                    System.out.print(p.data+" ");
                }
                System.out.println();
            }
        }
    
        public static void main(String[] asdf){
            LinkedStack mystack=new LinkedStack();
            System.out.println(mystack.isEmpty());
            mystack.pop();
            mystack.getTop();
    
            mystack.push("123");
            mystack.push("234");
            mystack.push("345");
            mystack.push("456");
            mystack.print();
    
            System.out.println(mystack.isEmpty());
            System.out.println(mystack.pop());
            mystack.pop();
            mystack.print();
        }
    }
    View Code

    1.2 栈-数组实现

    public class ArrayStack {
        private final int SIZE=30;
        private int[] stackarray=new int[SIZE];
        private int top=-1;
    
        public void push(int data){
            stackarray[++top]=data;
        }
        public boolean isEmpty(){
            if(top==-1)
                return true;
            else
                return false;
        }
        public int pop(){
            if(top<0){
                System.out.println("栈空,无法出栈");
                return Integer.MAX_VALUE;
            }
            else{
                int num=stackarray[top];
                top--;
                return num;
            }
        }
        public int getTop(){
            if(top<0){
                System.out.println("栈空,返回失败");
                return Integer.MAX_VALUE;
            }
            else{
                return stackarray[top];
            }
        }
        public void print(){
            if(top==-1)
                System.out.println("栈空,无输出");
            else{
                System.out.print("栈: ");
                int num=top;
                while(num>=0){
                    System.out.print(stackarray[num--]+" ");
                }
                System.out.println();
            }
        }
    
    
        public static void main(String args[]) {
            ArrayStack mystack=new ArrayStack();
            System.out.println(mystack.isEmpty());
            mystack.pop();
            mystack.getTop();
    
            mystack.push(1);
            mystack.push(2);
            mystack.push(3);
            mystack.push(4);
            mystack.print();
    
            System.out.println(mystack.isEmpty());
            mystack.pop();
            mystack.pop();
            mystack.print();
        }
    
    }
    View Code

    2,队列

    2.1队列-链表

      1 //Node类
      2 public class Node {
      3     public String data="";
      4     Node next=null;
      5 
      6     public Node(){
      7         data="THE-HEAD";
      8     }
      9     public Node(String data){
     10         this.data=data;
     11     }
     12 }
     13 
     14 //队列类
     15 
     16 public class LinkedQueue {
     17     private Node Head=new Node();
     18     private Node Tail=new Node();
     19     private int length=0;
     20 
     21     public boolean isEmpty(){
     22         return Head.next==null&&Tail.next==null;
     23     }
     24     //入队
     25     public void add(String data){
     26         Node newNode=new Node(data);
     27         if(length==0){
     28             Head.next=newNode;
     29             Tail.next=newNode;
     30             length++;
     31         }else{
     32             Tail.next.next=newNode;
     33             Tail.next=newNode;
     34             length++;
     35         }
     36     }
     37     //出队
     38     public String poll(){
     39         if(length<1){
     40             System.out.println("队列空,无法出队");
     41             return "ERROE-emptyQueue";
     42         }else if(length==1){
     43             String data=Head.next.data;
     44             Head.next=null;
     45             Tail.next=null;
     46             length--;
     47             return data;
     48         }
     49         else{
     50             Node p=Head.next;
     51             String data=Head.next.data;
     52             Head.next=p.next;
     53             length--;
     54             return data;
     55         }
     56     }
     57     //返回队首
     58     public String getHead(){
     59         if(length==0){
     60             System.out.println("队空,无队头");
     61             return null;
     62         }
     63         else{
     64             return Head.next.data;
     65         }
     66     }
     67 
     68     //遍历队列
     69     public void print(){
     70         if(length==0)
     71             System.out.println("队空,无输出");
     72         else{
     73             System.out.print("队列: Head->");
     74             Node p=Head;
     75             while(p.next!=null){
     76                 p=p.next;
     77                 System.out.print(p.data+"->");
     78             }
     79             System.out.println("(<-Tail) null");
     80         }
     81     }
     82 
     83 
     84     public static void main(String args[]) {
     85             LinkedQueue myQueue=new LinkedQueue();
     86             System.out.println(myQueue.isEmpty());
     87             myQueue.getHead();
     88             myQueue.poll();
     89 
     90             myQueue.add("12");
     91             myQueue.add("23");
     92             myQueue.add("34");
     93             myQueue.add("45");
     94 
     95             myQueue.print();
     96 
     97             myQueue.poll();
     98             myQueue.poll();
     99             myQueue.print();
    100 
    101     }
    102 
    103 }
    View Code

    2.2队列-数组

    循环数组队列,头指向第一个元素,尾指向最后一个元素的下一个

     1 //头指向第一个,尾指向最后一个的下一个
     2 //队空:Head==Tail
     3 //队满:(Tail+1)%SIZE==Head
     4 
     5 public class ArrayQueue {
     6     private int SIZE=10;
     7     private int[] queueArray=new int[SIZE];
     8     private int Head=0;
     9     private int Tail=0;
    10 
    11 
    12     //空?
    13     public boolean isEmpty(){
    14         if(Head==Tail){
    15             return true;
    16         }else
    17             return false;
    18     }
    19     //返回长度
    20     public int length(){
    21         if(Head==Tail)
    22             return 0;
    23         else if(Head<Tail)
    24             return Tail-Head;
    25         else{
    26             return SIZE-(Head-Tail);
    27         }
    28     }
    29     //入队
    30     public void add(int data){
    31         if((Tail+1)%SIZE==Head)
    32             System.out.println("队列已满,无法入队");
    33         else{
    34             queueArray[Tail]=data;
    35             Tail=(Tail+1)%SIZE;
    36         }
    37     }
    38     //出队
    39     public int poll(){
    40         if(Head==Tail){
    41             System.out.println("队空,无法出栈");
    42             return Integer.MAX_VALUE;
    43         }
    44         else
    45             return Head=(Head+1)%SIZE;
    46     }
    47     //返回队首
    48     public int getHead(){
    49         if(Head==Tail){
    50             System.out.println("队空,无队首");
    51             return Integer.MAX_VALUE;
    52         }
    53         else
    54             return queueArray[Head];
    55     }
    56 
    57     //遍历
    58     public void print(){
    59         if(Head==Tail)
    60             System.out.println("队空,无输出");
    61         else{
    62             System.out.print("队: ");
    63             int head=Head;
    64             while(Tail!=head){
    65                 System.out.print(queueArray[(head++)%SIZE]+" ");
    66             }
    67             System.out.println();
    68         }
    69     }
    70 
    71     public static void main(String args[]) {
    72             ArrayQueue myQueue=new ArrayQueue();
    73             System.out.println(myQueue.isEmpty());
    74             myQueue.getHead();
    75             myQueue.poll();
    76 
    77             myQueue.add(12);
    78             myQueue.add(23);
    79             myQueue.add(34);
    80             myQueue.add(45);
    81             System.out.println("队长 "+myQueue.length());
    82             myQueue.add(45);
    83             myQueue.add(45);
    84             myQueue.add(45);
    85             myQueue.add(45);
    86             myQueue.add(45);
    87             myQueue.add(45);
    88             System.out.println("队首 "+myQueue.getHead());
    89             System.out.println("队长 "+myQueue.length());
    90 
    91             myQueue.print();
    92 
    93             myQueue.poll();
    94             myQueue.poll();
    95             myQueue.print();
    96     }
    97 
    98 }
    View Code

    3,用栈表示队列,用队列表示栈

    3.1 栈->队列

          ①用两个栈,将数据从一个栈的顺序弹出压入另一个栈,刚好顺序相反-----满足队列一端进一端出要求,队列倒序遍历的一种实现方式;

           ②一个记录stackin记录入队顺序,栈顶当作队尾,另一个stackout记录出队顺序,栈顶当中队首

          ③要入队时,让数据从stackout弹出,在压进stackin,

      1 import java.util.Stack;
      2 
      3 public class StackQueue {
      4     private Stack<Integer> stackIn=new Stack<>();
      5     private Stack<Integer> stackOut=new Stack<>();
      6 
      7     public boolean isEmpty(){
      8         return stackIn.isEmpty()&&stackOut.isEmpty();
      9     }
     10     public void add(int data){
     11         if(stackIn.isEmpty()){
     12             while (!stackOut.isEmpty())
     13                 stackIn.push(stackOut.pop());
     14             stackIn.push(data);
     15         }else{
     16             stackIn.push(data);
     17         }
     18     }
     19     public int length(){
     20         if(stackIn.isEmpty())
     21             return stackOut.size();
     22         else
     23             return stackIn.size();
     24     }
     25     public int poll(){
     26         if(!isEmpty()){
     27             //stackin,stackOut都是专用的,不像queueStacck一样两个queue等价
     28             //因为①用两个栈,将数据从一个栈的顺序弹出压入另一个栈,刚好顺序相反-----满足队列一端进一端出要求
     29             //②用两个队列,因为把数据从一个队列移动到另一个队列顺序不变,所以这两个队列是等价,
     30             if(stackOut.isEmpty()){
     31                 //这里是用isempty判空,然后push最后一个,还是用size>1,直接返回popz最后一个,两者时间复杂度?
     32                 //https://blog.caoyu.info/is-empty-size-in-java.html
     33                 //ConcurrentLinkedQueue如类需要异步求当前size()
     34                 //isempty O(1)
     35                 //size()   通常O(1),有时O(n);
     36                 while (stackIn.size()>1)
     37                     stackOut.push(stackIn.pop());
     38                 return stackIn.pop();
     39             }else{
     40                 return stackOut.pop();
     41             }
     42         }else{
     43             System.out.println("队空,无出队");
     44             return Integer.MAX_VALUE;
     45         }
     46     }
     47     //遍历
     48     //遍历
     49     //可正序,也可倒叙
     50     public void print(){
     51         if(!isEmpty()){
     52             if(stackIn.isEmpty()){
     53                 System.out.print("倒序遍历: (队尾)");
     54                 while(!stackOut.isEmpty()){
     55                     int num=stackOut.pop();
     56                     System.out.print(num+"  ");
     57                     stackIn.push(num);
     58                 }
     59                 System.out.println();
     60                 System.out.print("正序遍历: (队首)");
     61                 while(!stackIn.isEmpty()){
     62                     int num=stackIn.pop();
     63                     System.out.print(num+"  ");
     64                     stackOut.push(num);
     65                 }
     66                 System.out.println();
     67             }else{
     68                 System.out.print("正序遍历: (队首)");
     69                 while(!stackIn.isEmpty()){
     70                     int num=stackIn.pop();
     71                     System.out.print(num+"  ");
     72                     stackOut.push(num);
     73                 }
     74                 System.out.println();
     75                 System.out.print("倒序遍历: (队尾)");
     76                 while(!stackOut.isEmpty()){
     77                     int num=stackOut.pop();
     78                     System.out.print(num+"  ");
     79                     stackIn.push(num);
     80                 }
     81                 System.out.println();
     82             }
     83         }else
     84             System.out.println("队空,无输出");
     85     }
     86 
     87 
     88 
     89     public static void main(String args[]) {
     90         StackQueue myQueue=new StackQueue();
     91         System.out.println(myQueue.isEmpty());
     92         //myQueue.getHead();
     93         myQueue.poll();
     94 
     95         myQueue.add(12);
     96         myQueue.add(23);
     97         myQueue.add(34);
     98         myQueue.add(45);
     99         System.out.println("队长 "+myQueue.length());
    100         myQueue.print();
    101         myQueue.add(56);
    102         myQueue.add(67);
    103         myQueue.add(78);
    104         myQueue.add(89);
    105         myQueue.add(90);
    106         myQueue.add(01);
    107         System.out.println("队长 "+myQueue.length());
    108         myQueue.print();
    109 
    110 
    111         myQueue.poll();
    112         myQueue.poll();
    113         System.out.println("队长 "+myQueue.length());
    114         myQueue.print();
    115     }
    116 
    117 }
    View Code

    3.2 队列表示栈

    ①用两个队列,因为把数据从一个队列移动到另一个队列顺序不变,所以这两个队列是等价,

    ②当要入栈时,将有数据的队列顺序出队进入另一个队列,留下最后一个数据,即栈顶数据,

    ③入栈直接进入有数据的队列队尾就行了

      1 import java.util.LinkedList;
      2 import java.util.Queue;
      3 
      4 //始终保持辅助队列为空,不为空为数据队列
      5 //只有两条队列都空才空
      6 public class QueueStack {
      7     private Queue<Integer> q1=new LinkedList<Integer>();
      8     private Queue<Integer> q2=new LinkedList<Integer>();
      9     public boolean isEmpty(){
     10         return (q1.isEmpty()&&q2.isEmpty());
     11     }
     12     //入栈
     13     public void push(int a){
     14         if(isEmpty())
     15             q1.add(a);
     16         else{
     17             if(q1.isEmpty())
     18                 q2.add(a);
     19             if(q2.isEmpty())
     20                 q1.add(a);
     21         }
     22     }
     23     //出栈
     24     public int pop(){
     25         if(!isEmpty()){
     26             if(q1.isEmpty()){
     27                 while(q2.size()>1)
     28                     q1.add(q2.poll());
     29                 return q2.poll();
     30             }else {
     31                 while(q1.size()>1)
     32                     q2.add(q1.poll());
     33                 return q1.poll();
     34             }
     35         }else {
     36             System.out.println("栈空,无出栈");
     37             return Integer.MAX_VALUE;
     38         }
     39     }
     40     //返回栈首
     41     public int peek(){
     42         int num;
     43         if(!isEmpty()){
     44             if(q1.isEmpty()){
     45                 while(q2.size()>1)
     46                     q1.add(q2.poll());
     47                 num=q2.poll();
     48                 q1.add(num);
     49                 return num;
     50             }else {
     51                 while(q1.size()>1)
     52                     q2.add(q1.poll());
     53                 num=q1.poll();
     54                 q2.add(num);
     55                 return num;
     56             }
     57         }else{
     58             System.out.println("栈空,无栈头");
     59             return Integer.MAX_VALUE;
     60         }
     61     }
     62     //遍历
     63     public void print(){
     64         if(!isEmpty()){
     65             System.out.print("栈: ");
     66             if(q1.isEmpty()){
     67                 while (!q2.isEmpty()){
     68                     int num=q2.poll();
     69                     System.out.print(num+" ");
     70                     q1.add(num);
     71                 }
     72                 System.out.println();
     73             }else{
     74                 while (!q1.isEmpty()){
     75                     int num=q1.poll();
     76                     System.out.print(num+" ");
     77                     q2.add(num);
     78                 }
     79                 System.out.println();
     80             }
     81         }else
     82             System.out.println("栈空,无输出");
     83     }
     84 
     85 
     86     public static void main(String args[]) {
     87         QueueStack s=new QueueStack();
     88         s.isEmpty();
     89         s.peek();
     90         s.pop();
     91 
     92         s.push(5);
     93         s.push(6);
     94         s.push(7);
     95         s.push(8);
     96         s.print();
     97 
     98         System.out.println(s.peek());
     99         System.out.println(s.pop());
    100         System.out.println(s.pop());
    101         s.print();
    102 
    103     }
    104 
    105 
    106 }
    View Code

    4,栈队列相关算法

    参考网上帖子

    转载:简书ID:@我没有三颗心脏
    https://www.jianshu.com/p/5087c751cb42

    4.1
    ①最小堆问题,数据栈+辅助栈,辅助栈负责记录每一个值入栈时,当前数据栈状态得最小值,即每一个数入栈时如果<=辅助栈栈顶值,同时进辅助栈,
    ②出队时一样与辅助栈栈顶比较,与辅助栈顶相同则辅助栈pop,
    ③,辅助栈保证栈顶始终是数据栈当前状态下的最小值,
     1 import java.util.Stack;
     2 
     3 //入栈
     4   //空栈加入第一个元素,两个栈都push;
     5   //栈非空,push时若小于min栈顶元素,min栈也入
     6 //出栈
     7   //若data栈顶==min栈顶,双栈出;!=min栈不出
     8 public class MinStack {
     9     private Stack<Integer> data=new Stack<>();
    10     private Stack<Integer> min=new Stack<>();
    11 
    12     public boolean isEmpty(){
    13         return data.isEmpty();
    14     }
    15 
    16     public void push(int a){
    17         if(isEmpty()){
    18             data.push(a);
    19             min.push(a);
    20         }else{
    21             data.push(a);
    22             if(a<=min.peek())
    23                 min.push(a);
    24         }
    25     }
    26     public void pop(){
    27         if(!isEmpty()){
    28             int a=data.pop();
    29             if(a==min.peek())
    30                 min.pop();
    31         }else{
    32             System.out.println("栈空,出栈失败");
    33         }
    34     }
    35     public int peek(){
    36         if(!isEmpty())
    37             return data.peek();
    38         else
    39             return Integer.MAX_VALUE;
    40     }
    41     public int getMind(){
    42         if(!isEmpty())
    43             return min.peek();
    44         else return Integer.MAX_VALUE;
    45     }
    46 
    47     public static void main(String args[]) {
    48             MinStack m=new MinStack();
    49             m.push(-1);
    50             m.push(3);
    51             m.push(-3);
    52             m.push(5);
    53             m.push(-2);
    54             m.push(8);
    55 
    56             System.out.println("最小 "+m.getMind());
    57             
    58             m.pop();
    59             System.out.println("最小 "+m.getMind());
    60             m.pop();
    61             System.out.println("最小 "+m.getMind());
    62             m.pop();
    63             System.out.println("最小 "+m.getMind());
    64             m.pop();
    65             System.out.println("最小 "+m.getMind());
    66     }
    67 
    68 
    69 }
    View Code

    4.2  括号匹配问题,{} []()<>

    左括号直接入栈,遇到右括号,栈顶一定是与之匹配的左括号,是-出栈,不是-直接返回错误

    
    
     1 //转载:简书ID:@我没有三颗心脏
     2 //https://www.jianshu.com/p/5087c751cb42
     3 import java.util.Scanner;
     4 import java.util.Stack;
     5 
     6 public class Stack_Use_For {
     7 
     8     //LeetCode 相关题目整理
     9     //20.有效的括号
    10     public boolean isRight(String s){
    11         
    12         Stack<Character> stack=new Stack<>();
    13         if(s.length()==0)
    14             return false;
    15         else{
    16             for(int i=0;i<s.length();i++){
    17                 char c=s.charAt(i);
    18                 if(c=='('||c=='['||c=='<'||c=='{')
    19                     stack.push(c);
    20                 else{
    21                     if(c==']'&&stack.pop()!='['){
    22                         return false;
    23                     }
    24                     if(c=='}'&&stack.pop()!='{'){
    25                         return false;
    26                     }
    27                     if(c=='>'&&stack.pop()!='<'){
    28                         return false;
    29                     }
    30                     if(c==')'&&stack.pop()!='('){
    31                         return false;
    32                     }
    33                 }
    34             }
    35         }
    36         if(stack.empty()){
    37             return true;
    38         }else{
    39             return false;
    40         }
    41 
    42         
    43     }
    44 
    45     public static void main(String args[]) {
    46         Stack_Use_For stack=new Stack_Use_For();
    47 
    48         System.out.println("请输入包含{}[]()<>的字符串");
    49         Scanner sc=new Scanner(System.in);
    50         String s=sc.nextLine();
    51 
    52 
    53         System.out.println(stack.isRight(s));
    54 
    55 
    56     }
    57     
    58     
    59 }
    View Code
    
    

    4.3 某给定顺序序列入栈的出栈序列问题,比如1234567入栈,5436721是否是出栈序列问题

    唉,自己的方法太蠢,233,,思路没问题,实现起来太容易出错,下标很乱

      1 //https://www.jianshu.com/p/5087c751cb42
      2 
      3 /*
      4 * 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假
      5 * 设压入栈的所有数字均不相等。例如,序列{1,2,3,4,5}是某栈的压栈序列,序列{4,5,3,2,1}是该压
      6 * 栈序列对应的一个弹出序列,但{4,3,5,1,2}就不可能是该压栈序列的弹出序列。
      7 
      8 */
      9 
     10 /**
     11  * 思路1:从前往后遍历弹出序列,求出弹出值入序的下标x,在求出入序列表中在x之前的元素的出序下标数组
     12  * ,这个数组是降序的,不是降序的则错误,因为靠近X 的先弹出。
     13  *
     14  * 前提:序列元素不能重复
     15  */
     16 
     17 /**
     18  * 更正思路1
     19  * 思路1错了一部分,求出第一个值后,若没返回false则证明x之前的元素顺序都对,则就不用考虑这些元素了,即把1-x之间的元素从out
     20  * 中删除(in也要删除),不是从前往后遍历,而是跳着遍历,
     21  * 
     22  * 
     23  * 不能删除,删除后后面的下标就乱了2333,,还是得用特殊字符代替,
     24  * 
     25  * 
     26  * * (我们拿到输出序列往外很关注第一个值,比如1234567入栈,如果出栈序列第一个是5,那么4321的出栈顺序就限制住了,
     27  *  * 4要在321前面中间肯有其他值比如67,只要是4在出序中的位置下标比3小,3比2小,以此类推,如果4有差错,直接返回错误
     28  *  * ,如果没错,出栈序列中54321(5是第一个,下标肯定比4321小)就不用遍历了,已经确认没问题了,可以标记一下如替换“-”,接着拿
     29  *  * 下一个非“-”当作“第一个”继续,)
     30  *
     31  * 
     32 
     33  */
     34 import java.util.Stack;
     35 public class Stack_Out_Order {
     36     //工地英语,是否是in序的out
     37     //这里用String返回值,方便定位哪里出了问题,到底是哪里下标设计会溢出,
     38     public String isOutOfIn(String in,String out){
     39         if(out.length()!=in.length())
     40             return "false1";
     41         else{
     42             //遍历出序的值
     43             for(int i=0;i<out.length();i++){
     44                 char curChar=out.charAt(i);
     45                 //找出curChar在入序中的下标,
     46                 int index=findIndex(curChar,in);
     47                 //curChar不在入序
     48                 if(index==Integer.MAX_VALUE)
     49                     return "false2";
     50                 //找出入序中在index之前的元素,并求他们在出序中的位置
     51                 int indexarry=Integer.MAX_VALUE;//保证其比下一个index大即可,不需要存数组
     52                 for(int j=0;j<index;j++){
     53                     if(in.charAt(j)=='_')
     54                         ;
     55                     else{
     56                         char curChar2=in.charAt(j);
     57                         int index2=findIndex(curChar2,out);
     58                         if (index2>indexarry){
     59                             return "false3";
     60                         }
     61                         else {
     62                             indexarry=index2;
     63 
     64                             //删除ste指定index上的char;
     65                             out=out.substring(0,index2)+"_"+out.substring(index2+1,out.length());
     66                             int index3=findIndex(curChar2,in);
     67                             in=in.substring(0,index3)+"_"+in.substring(index3+1,in.length());
     68 
     69                         }
     70                     }
     71                 }
     72                 //把第一个也删掉才对
     73                 out=out.substring(0,i)+"_"+out.substring(i+1,out.length());
     74                 in=in.substring(0,index)+"_"+in.substring(index+1,in.length());
     75 
     76             }
     77             //遍历完无返回false,即true;
     78             return "true";
     79         }
     80 
     81     }
     82     //假设序列中无重复值,
     83     public int findIndex(char c,String in){
     84         for(int i=0;i<in.length();i++){
     85             if(c==in.charAt(i))
     86                 return i;
     87         }
     88         return Integer.MAX_VALUE;
     89         //若不在入序中返回标记,直接非出序
     90     }
     91 
     92 
     93 
     94 
     95     //看了原博主的方法,还标准方法简单,啊啊啊
     96     public boolean isOutOfIn2(String in,String out){
     97         Stack<Character> stack=new Stack<>();
     98         int indexin=0;
     99         int indexout=0;
    100 
    101         while (indexout<out.length()){
    102             while(indexin<in.length()&&(stack.isEmpty()||stack.peek()!=out.charAt(indexout))){
    103                 stack.push(in.charAt(indexin++));
    104             }
    105             if(out.charAt(indexout)==stack.peek()){
    106                 stack.pop();
    107                 indexout++;
    108             }else{
    109                 return false;
    110             }
    111         }
    112         return true;
    113     }
    114 
    115     public static void main(String args[]) {
    116         String in="1234567";
    117         String out1="5432167";
    118         String out2="5431267";
    119         String out3="1234567";
    120         String out4="2367541";
    121         String out5="7654321";
    122         String out6="7564321";
    123         Stack_Out_Order s=new Stack_Out_Order();
    124         System.out.println(in+" "+out1+"  "+s.isOutOfIn(in,out1));
    125         System.out.println(in+" "+out2+"  "+s.isOutOfIn(in,out2));
    126         System.out.println(in+" "+out3+"  "+s.isOutOfIn(in,out3));
    127         System.out.println(in+" "+out4+"  "+s.isOutOfIn(in,out4));
    128         System.out.println(in+" "+out5+"  "+s.isOutOfIn(in,out5));
    129         System.out.println(in+" "+out6+"  "+s.isOutOfIn(in,out6));
    130         System.out.println();
    131 
    132         System.out.println(in+" "+out1+"  "+s.isOutOfIn2(in,out1));
    133         System.out.println(in+" "+out2+"  "+s.isOutOfIn2(in,out2));
    134         System.out.println(in+" "+out3+"  "+s.isOutOfIn2(in,out3));
    135         System.out.println(in+" "+out4+"  "+s.isOutOfIn2(in,out4));
    136         System.out.println(in+" "+out5+"  "+s.isOutOfIn2(in,out5));
    137         System.out.println(in+" "+out5+"  "+s.isOutOfIn2(in,out6));
    138     }
    139 
    140 }
    View Code
     
  • 相关阅读:
    nodejs
    Linux 的常用命令
    vue入门学习1_事件及修饰符
    mongo笔记
    spring boot笔记
    CentOS 6 ElasticSearch 5.5.x 安装指南
    linux用户和用户组
    linux下配置安装
    linux命令
    elasticsearch
  • 原文地址:https://www.cnblogs.com/wangpan8721/p/13688144.html
Copyright © 2020-2023  润新知