|
Java的数据结构主要涉及三种数据存储类型:栈,队列,优先级队列。这些数据存储类型的生命周期比数组等数据结构要短得多,在程序执行期间才被创建。栈的主要机制可以用数组来实现;队列,优先级队列可以使用数组或者一种特别的树 - 堆来实现。通过对数组进行封装,使得他们面向的问题更加专业。
1)在这些数据结构中,只有一个数据项可以被访问。
2)栈的操作是在栈顶压入一个数据项,以及从栈顶移除一个数据项。
3)队列的操作是在队尾压入数据,在队头取出数据。
4)优先级队列的操作是有序的插入数据,从队头取出关键字最小、最大的数据。
1. 栈
1.1. 栈的实现
栈只允许访问一个数据项,即最后插入的数据项。移除这个数据项才能访问第二个数据项。一般来说将数组经过一定包装,使之满足压栈,弹栈的性质就能实现栈的基本能力。栈通常包含三个数据成员,两个基本方法:一个数组,一个最大栈空间,一个top指针;压栈,弹栈(读取栈顶元素)。 - /**
- * @file 简单地说, 栈就是将数组进行封装来更方便的实现一些功能
- * @author zkj
- * @date 2017-07-27
- */
- class Stack {
- // 数据成员
- private int maxSize;
- private int[] stackArray;
- private int top;
- // 构造函数
- public Stack ( int size) {
- maxSize = size;
- stackArray = new int[maxSize];
- top = - 1;
- }
- // 压栈
- public void push ( int element) {
- if (!isFull())
- stackArray[++top] = element;
- }
- // 弹栈
- public int pop () {
- return stackArray[top--];
- }
- }
|
1.2 栈的应用
栈的主要应用:文本匹配,比如检测源程序中括号匹配问题;算术表达式解析,比如3 * (4 + 5);大部分微处理器基于栈的体系结构,在函数被调用时压栈,弹栈。
1.2.1 文本括号匹配
对于一串文本,检查括号是否匹配,比如abc{defg[hijklm(nopq)rstu]v}wxyz,检测括号是否配对。解决办法:遍历字符串,将{, [, ( 依次入栈(普通字符不入栈),当遍历到), ] }时,弹栈,进行比较,看两者是否匹配。
- // 栈类:实现栈操作
- class StackChar {
- // 数据成员
- private int maxSize;
- private char[] stackArray;
- private int top;
- // 构造函数
- public StackChar ( int size) {
- maxSize = size;
- stackArray = new char[maxSize];
- top = - 1;
- }
- // 压栈
- public void push ( char element) {
- if (!isFull())
- stackArray[++top] = element;
- }
- // 弹栈
- public char pop () {
- return stackArray[top--];
- }
- // 栈满?
- public boolean isFull () {
- if (top == maxSize)
- return true;
- else
- return false;
- }
- // 栈空?
- public boolean isEmpty () {
- if (top < 0)
- return true;
- else
- return false;
- }
- }
|
- // 检查是否匹配
- class BracketChecker {
- private String input;
- public BracketChecker (String in) {
- input = in;
- }
- public void check () {
- int stackSzie = input.length();
- StackChar theStack = new StackChar(stackSzie);
- for ( int i = 0; i < stackSzie; i++) {
- char ch = input.charAt(i);
- switch (ch) {
- case '{':
- case '[':
- case '(':
- theStack.push(ch);
- break;
- case '}':
- case '>':
- case ')':
- if (!theStack.isEmpty()) {
- char chx = theStack.pop();
- if ((chx == '{' && ch != '}') || (chx == '[' && ch != ']') || (chx == '(' && ch != ')')) {
- System.out.println( "Error: " + ch + " at " + i);
- }
- }
- else
- System.out.println( "Error: " + ch + " at " + i);
- default:
- break;
- }
- }
- if (!theStack.isEmpty()) {
- System.out.println( "Error: missing right delimiter.");
- }
- }
- }
|
2. 队列
栈的特性是:先进后出;队列则是:先进先出。比如打印机打印东西的顺序,银行叫号排队系统等等。队列六个基本元素:存储数据的数组,头指针,尾指针,队列最大尺寸,数据进队列,数据出队列。
2.1 队列的实现
- // 队列类
- class Queue {
- // 数据成员
- private int[] arr;
- private int head;
- private int tail;
- private int maxSize;
- // 构造函数
- public Queue ( int size) {
- maxSize = size;
- head = - 1;
- tail = - 1;
- }
- // 压入队列
- public void push ( int element) {
- if (tail <= maxSize){
- arr[++tail] = element;
- }
- }
- // 移除队列
- public int pop () {
- return arr[++head];
- }
- }
|
3. 优先级队列
优先级队列是指队列中的元素按照某种顺序进行排列,比如数值型数据的大小顺序,字符型数据字典序等等。有序插入,队头取出。
----------------------------
原文链接:https://blog.csdn.net/ZK_J1994/article/details/76184916
程序猿的技术大观园:www.javathinker.net
[这个贴子最后由 flybird 在 2020-02-06 21:08:27 重新编辑]
|
|