这里主要介绍如何用代码来实现一个栈,并附上了一个简单的栈的应用,并没有具体介绍栈。
栈是一种特殊的存储结构,遵循先进后出(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