算法 之 栈的简单讲解

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

是一种特殊的存储结构,遵循先进后出(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

 



 

posted @ 2015-11-25 21:18  千个太阳在手中  阅读(524)  评论(0编辑  收藏  举报