zoukankan      html  css  js  c++  java
  • 栈实现java

      栈是一种“先去后出”的抽象的数据结构。例如:我们在洗盘子的时候,洗完一个盘子,将其放在一摞盘子的最上面,但我们全部洗完后,要是有盘子时,我们会先从最上面的盘子开始使用,这种例子就像栈的数据结构一样,先放进去的数据,最后才能得到。

          栈不仅在生活中有很多例子,在计算机方面使用的更为频繁。如:大部分处理器运用基于栈的体系结构,当调用一个方法时,把他的返回地址和参数压入栈,当方法结束返回时,那些数据出栈。栈操作就嵌入在微处理器中。还有比如较老的计算器也是这样,他们不是输入带括号的算术表达式,而是把中间结果先存入栈中等等。

      栈原理图示:

     栈代码实现(下面还有分隔符匹配例子的代码):

    栈类实现:

    package com.dxx.stack;
    
    public class StackX {
        private int maxSize;
        private int[] stackArray;
        private int top;
        
    //构造器中初始化栈的数组,并将栈定索引置为-1,表示栈为空。
        public StackX(int maxSize) {
            super();
            this.maxSize = maxSize;
            stackArray = new int[maxSize];
            top = -1;
        }
        //判断栈是否为空,在出栈操作前都要先判断栈是否空,若为空,则不能出栈。
        public boolean isEmpty(){
            if(top == -1)
                return true;
            return false;
        }
        //判断栈是否已满,在入栈操作前都要先判断栈是否已满,若已满,则不能入栈。
        public boolean isFull(){
            if(top == maxSize-1)
                return true;
            return false;
        }
        //入栈
        public void push(int num){
            if(!isFull()){
                stackArray[++top] = num;
            }else {
                System.out.println("栈已满,不能再进行入栈操作。");
            }
        }
        //出栈
        public int pop(){
            if(!isEmpty()){
                return stackArray[top--];
            }else {
                System.out.println("栈为空,不能获取栈定元素");  return 0;
            }
        }
        //取栈顶元素
        public int peek(){
            if(!isEmpty()){
                return stackArray[top];
            }else {
                System.out.println("栈为空,不能获取栈定元素");    return 0;
            }
        }
    
    }

    主程序测试:

    package com.dxx.stack;
    
    public class StackMain {
    
        public static void main(String[] args) {
            StackX stackX = new StackX(5);
            stackX.peek();
            stackX.push(0);
            stackX.push(1);
            stackX.push(2);
            stackX.push(3);
            stackX.push(4);
            stackX.push(5);
            System.out.println(stackX.pop());
            System.out.println(stackX.pop());
            System.out.println(stackX.pop());
        }
    
    }

    输出结果:

    栈为空,不能获取栈定元素
    栈已满,不能再进行入栈操作。
    4
    3
    2

    下面就是分隔符匹配的例子代码:

    分析:

     

    分隔符栈的类:

    package com.dxx.stack;
    
    public class BracketStackX {
        private int maxSize;
        private char[] stackArray;
        private int top;
        
    //构造器中初始化栈的数组,并将栈定索引置为-1,表示栈为空。
        public BracketStackX(int maxSize) {
            super();
            this.maxSize = maxSize;
            stackArray = new char[maxSize];
            top = -1;
        }
        //判断栈是否为空,在出栈操作前都要先判断栈是否空,若为空,则不能出栈。
        public boolean isEmpty(){
            if(top == -1)
                return true;
            return false;
        }
        //判断栈是否已满,在入栈操作前都要先判断栈是否已满,若已满,则不能入栈。
        public boolean isFull(){
            if(top == maxSize-1)
                return true;
            return false;
        }
        //入栈
        public void push(char ch){
            if(!isFull()){
                stackArray[++top] = ch;
            }else {
                System.out.println("栈已满,不能再进行入栈操作。");
            }
        }
        //出栈
        public char pop(){
            if(!isEmpty()){
                return stackArray[top--];
            }else {
                System.out.println("栈为空,不能获取栈定元素");  return 0;
            }
        }
        //取栈顶元素
        public char peek(){
            if(!isEmpty()){
                return stackArray[top];
            }else {
                System.out.println("栈为空,不能获取栈定元素");    return 0;
            }
        }
    }

    字符串匹配检查类:

    package com.dxx.stack;
    //定义一个检查分隔符是否匹配的工具栏
    public class BracketCheck {
        private String input;
    
        public BracketCheck(String input) {
            super();
            this.input = input;
        }
            
        public boolean chek(){
            //先实例化有关分隔符的栈
            BracketStackX stackX = new BracketStackX(input.length());
            //依次比较input的字符,如果是左分隔符,就入栈,是右分隔符,就出栈与右分隔符匹配。
            for(int i=0; i<input.length(); i++){
                char ch = input.charAt(i);
                switch(ch){
                case '{':
                case '[':
                case '(':
                    stackX.push(ch);
                    break;
                case ')':
                case ']':
                case '}':
                    char ch2 = stackX.pop();
                    if(ch==')'&&ch2=='(' ||ch==']'&&ch2=='[' ||ch=='}'&&ch2=='{'){
                    }else {
                        return false;
                    }
                    break;
                }
            }
            if(!stackX.isEmpty()){
                return false;
            }
            return true;
            
        }
    
    }

    主程序测试:

    package com.dxx.stack;
    
    public class StackMain {
    
        public static void main(String[] args) {
            BracketCheck bracketCheck = new BracketCheck("123{{[4444(3333)fff]ddddd}");
            if(bracketCheck.chek())
                System.out.println("匹配");
            else 
                System.out.println("不匹配");
        }
    
    }

    结果为:不匹配。

    大家有兴趣还可以练习一个单子逆序显示。

  • 相关阅读:
    Log4net简介
    LOG4NET用法
    RabbitMQ 使用参考
    消息队列 RabbitMQ 入门介绍
    RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较
    RabbitMQ学习之:(十二)在Node.js环境下使用RabbitMQ
    RabbitMQ学习之:(十一)AMQP.0-10规范,中文翻译1,2,3章 (转载)
    谷歌如何测试软件 —— 第三部分
    【转】在淘宝一年测试工作的感悟
    青春年少,风华正茂
  • 原文地址:https://www.cnblogs.com/dxx-blogs/p/4472045.html
Copyright © 2011-2022 走看看