您的位置:首页 > 理论基础 > 数据结构算法

Java数据结构与算法 - 栈和队列

2017-07-27 13:31 417 查看
主要涉及三种数据存储类型:栈,队列,优先级队列。这些数据存储类型的生命周期比数组等数据结构要短得多,在程序执行期间才被创建。栈的主要机制可以用数组来实现;队列,优先级队列可以使用数组或者一种特别的树 - 堆来实现。通过对数组进行封装,使得他们面向的问题更加专业。

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. 优先级队列

优先级队列是指队列中的元素按照某种顺序进行排列,比如数值型数据的大小顺序,字符型数据字典序等等。有序插入,队头取出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 算法