• 算法 之 栈的简单讲解


    这里主要介绍如何用代码来实现一个栈,并附上了一个简单的栈的应用,并没有具体介绍栈。

    是一种特殊的存储结构,遵循先进后出(First in last out)的原则。在栈中,只允许访问一个数据项,即最后插入的数据项,只有当前的栈顶元素出栈之后,才能访问下一个元素。接下来,我们来看一下如何实现一个栈。解释都在代码中:

    package stackTest;
    

    //这是新建的作为栈的类
    public class StackX { private int maxSize; //用于设置栈的容量大小 private long[] stackArray; //用数组来存储栈的数据,这里只能存储long型的数据 private int Top;  //栈的头指针 //结构体,初始化数据 public StackX(int s){ maxSize = s; stackArray = new long[maxSize]; Top = -1; } //入栈方法,Top先自加,在为数组赋值 public void push(int value){ stackArray[++Top] = value; } //出栈方法 public long pop(){ return stackArray[Top--]; } //查询当前栈顶元素 public void peek(){ System.out.println(stackArray[Top]); } //判断是否为空栈 public boolean isEmpty(){ return (Top == -1); } //判断栈是否已经满了 public boolean isFull(){ return (Top == maxSize-1); } }

     有兴趣的博友可以新建一个类,调用里面的方法来实现出栈和入栈。下面我们来用栈来实现一个简单的操作:

    分隔符匹匹配:分割符包括{、}、(、)、[、]、每个左分隔符都需要和右分隔符相匹配。同时先出现的左分割符应该比后出现的左分割符晚匹配

    如c[b]              正确

    a{b[c]d}e   正确

    a{b[c}d]e   错误

    a[b       错误

    1.新建一个作为栈的类,可以将上面的改一下,改为能存储字符串的栈

    2.在新建一个类,用来实现匹配检测的方法:

    //用于分隔符的匹配方法类
    public class Bracker {
        private String input;
        public Bracker(String in){
            input = in;
        }
        public void check(){
            //将传入的input字符串长,作为栈的大小
            int maxSize = input.length();
            StackX sX = new StackX(maxSize);
            //将输入的分割符入栈
            for (int i = 0; i < input.length(); i++) {
                //调用charAt方法,依次得到input字符串的每个字符
                char ch = input.charAt(i);
                switch (ch) {
                case '{':
                case '[':
                case '(':
                    sX.push(ch);
                    break;
                case ')':
                case '}':
                case ']':
                    if (!sX.isEmpty()) {
                        char chx = sX.pop();
                        if (ch == ')'&&chx != '('||
                            ch == ']'&&chx != '['||
                            ch == '}'&&chx != '{') {
                            System.out.println("ERROR:" + ch + " at " + i);
                        }
                    }
                    break;
                default:
                    break;
                }
            }
            
            //最后sX没有完全出栈的话,证明左右分割符不对等
            if (!sX.isEmpty()) {
                System.out.println("Error:missing right delimiter");
            }
        }
    }

    主类:

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class BrackerApp {
        public static void main(String[] args) throws IOException{
            String input ;
            while(true){
                System.out.println("Enter string containing delimiters");
                System.out.flush();   //强制将缓冲区中的数据发送出去,而不必等到缓冲区满
                input = getString();
                if (input.equals("")) {
                    System.out.println("你没有输入:");
                }
                //新建一个Bracker对象
                Bracker bracker = new Bracker(input);
                bracker.check();
                
            }
        }
        
        public static String getString() throws IOException{
            //读取输入流
            InputStreamReader in = new InputStreamReader(System.in);
            //将输入流中的数据放进br中
            BufferedReader br = new BufferedReader(in);
            //读取br中的一行数据
            String s = br.readLine();
            return s;
        }
    }

    运行结果:

    Enter string containing delimiters
    a[b{c}d]e
    Enter string containing delimiters
    a[b(c}d]
    ERROR:} at 5
    Enter string containing delimiters



  • 相关阅读:
    开心菜鸟系列学习笔记------javascript(5)
    开心菜鸟系列学习笔记-------javascript(3)
    开心菜鸟学习系列-----javascript(2)
    开心菜鸟学习系列笔记-----Javascript(1)
    开心菜鸟系列----函数作用域(javascript入门篇)
    开心菜鸟系列----变量的解读(javascript入门篇)
    开心菜鸟笔记系列---正则表达式笔记(入门篇)
    开心菜鸟笔记系列---博客开篇贴!(求支持)
    在开启bin-log日志下Mysql报错
    开心菜鸟学习系列学习笔记------------nodejs util公共函数
  • 原文地址:https://www.cnblogs.com/mercuryli/p/4995899.html
Copyright © 2020-2023  润新知