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

优先级队列是指队列中的元素按照某种顺序进行排列,比如数值型数据的大小顺序,字符型数据字典序等等。有序插入,队头取出。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值