Java数据结构与算法 - 栈和队列
2017-07-27 13:31
417 查看
主要涉及三种数据存储类型:栈,队列,优先级队列。这些数据存储类型的生命周期比数组等数据结构要短得多,在程序执行期间才被创建。栈的主要机制可以用数组来实现;队列,优先级队列可以使用数组或者一种特别的树 - 堆来实现。通过对数组进行封装,使得他们面向的问题更加专业。
1)在这些数据结构中,只有一个数据项可以被访问。
2)栈的操作是在栈顶压入一个数据项,以及从栈顶移除一个数据项。
3)队列的操作是在队尾压入数据,在队头取出数据。
4)优先级队列的操作是有序的插入数据,从队头取出关键字最小、最大的数据。
1. 栈
1.1. 栈的实现
栈只允许访问一个数据项,即最后插入的数据项。移除这个数据项才能访问第二个数据项。一般来说将数组经过一定包装,使之满足压栈,弹栈的性质就能实现栈的基本能力。栈通常包含三个数据成员,两个基本方法:一个数组,一个最大栈空间,一个top指针;压栈,弹栈(读取栈顶元素)。
1.2 栈的应用
栈的主要应用:文本匹配,比如检测源程序中括号匹配问题;算术表达式解析,比如3 * (4 + 5);大部分微处理器基于栈的体系结构,在函数被调用时压栈,弹栈。
1.2.1 文本括号匹配
对于一串文本,检查括号是否匹配,比如abc{defg[hijklm(nopq)rstu]v}wxyz,检测括号是否配对。解决办法:遍历字符串,将{, [, ( 依次入栈(普通字符不入栈),当遍历到), ] }时,弹栈,进行比较,看两者是否匹配。
2. 队列
栈的特性是:先进后出;队列则是:先进先出。比如打印机打印东西的顺序,银行叫号排队系统等等。队列六个基本元素:存储数据的数组,头指针,尾指针,队列最大尺寸,数据进队列,数据出队列。
2.1 队列的实现
3. 优先级队列
优先级队列是指队列中的元素按照某种顺序进行排列,比如数值型数据的大小顺序,字符型数据字典序等等。有序插入,队头取出。
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. 优先级队列
优先级队列是指队列中的元素按照某种顺序进行排列,比如数值型数据的大小顺序,字符型数据字典序等等。有序插入,队头取出。
相关文章推荐
- java数据结构与算法-优先级队列
- Java数据结构和算法--栈与队列
- Java数据结构和算法-栈和队列(1-前言+栈)
- 【Java】Java数据结构和算法(二)——栈和队列
- java数据结构与算法之(Queue)队列设计与实现
- Java数据结构和算法(五)——队列
- Java数据结构和算法(五)——队列
- Java数据结构与算法之Queue队列
- Java数据结构和算法(五)——队列
- 【Java数据结构学习笔记之三】Java数据结构与算法之队列(Queue)实现
- Java数据结构和算法--栈与队列
- Java数据结构与算法:队列
- java数据结构和算法------队列
- 队列的创建 入队出队 Java数据结构与算法
- java数据结构和算法-2,栈和队列
- java数据结构与算法 第4章 栈和队列
- Java数据结构和算法(五)——队列
- Java数据结构和算法--栈与队列
- Java数据结构和算法-栈和队列(4-解析算术表达式)
- Java数据结构和算法——队列