本次学习主题是栈和队列。 栈和队列应该是数据结构中非常基本的结构单元,一般作为其他结构的组成单元或者算法中。 和数组的随机访问特性不同,栈的特点是后进先出(LIFO),队列的特点是先进先出(FIFO)。 数组应该是非常基本的数据结构单元了,所以数组类型非常直观,就是一个物理和逻辑结构都连续的空间。而栈和队列就更加抽象一些,一般通过接口定义其特性,然后可以通过很多方式来实现。 这次的学习内容依然很基础,主要内容为栈、队列、优先级队列。都是通过数组实现(也可以通过链表,后面会有学习)。其中优先级队列就是在队列的基础上,不是直接将数据插入表尾,而是根据优先级插入到同优先级数列的最后,保证插入操作完成后队列仍然是优先级有序的。 1-栈代码如下:
public class StackX { private char[] ar; private int size; public StackX(int s) { ar = new char[s]; size = 0; } public void push(char v) { if (isFull()) { return; } ar[size++] = v; } public char pop() { if (isEmpty()) { return 0; } return ar[--size]; } public char peek() { return ar[size - 1]; } public void displayStack() { System.out.println("{"); for (int i = 0; i <= size; i++) { System.out.println("" + ar[i] + ","); } System.out.println("}"); } public boolean isEmpty() { // System.out.println("the stack is empty"); return size == 0; } public boolean isFull() { // System.out.println("the stack is full"); return size == ar.length; } }检测字符串分隔符代码如下:
//分隔符匹配 public class BracketChecker { private String checkStr; public BracketChecker(String s) { checkStr = s; } public boolean check() { int length = checkStr.length(); StackX sx = new StackX(length); for (int i = 0; i < length; i++) { char temp = checkStr.charAt(i); switch (temp) { case '{': case '[': case '(': { sx.push(temp); break; } case '}': case ']': case ')': { if (!sx.isEmpty()) { if ((temp == '}' && sx.pop() != '{') || (temp == ']' && sx.pop() != '[') || (temp == ')' && sx.pop() != '(')) { System.out.println("error char at " + temp); return false; } } else { System.out.println("error char at " + temp); return false; } } default: break; } } if (sx.isEmpty()) { return true; } return false; } }2-队列代码实现:因为队列和栈基本差不多,只是插入删除有些区别,这里只列出主要部分。
public class QueueX { private int MaxSize; private long[] ar; private int front; private int rear; private int count;// 当前数组数量,也可以不用,通过front 和 rear来计算 public void insert(long value) { if (rear == MaxSize - 1) { rear = -1;// 循环队列,从数组最后跑到最前面 } ar[++rear] = value; count++; } public long remove() { long temp = ar[front++]; if (front == MaxSize) { front = 0; } count--; return temp; } }3-优先级队列与队列基本相同,主要区别就是插入时是否有序,因此只写出优先级队列的插入方法:
public void proInsert(long value) { if (0 == count) { ar[count++] = value; } else { int j; for (j = count - 1; j >= 0; j--) { if (value > ar[j]) { ar[j + 1] = ar[j]; } else { break; } } ar[j + 1] = value; count++; } }栈和队列可以用于表达式解析,中缀转后缀等应用,一般都是做辅助。 Java的集合框架应该去学习一下,网上类似的资料已经很多,应该去研究一下。