三.栈和队列
1.栈的定义:先进后出,在此使用的数组进行栈的实现;栈的时间复杂度是O(1);
2.在栈的构造过程中提供了入栈、出栈、查看、判空、判满方法:
public class StackX {
private int maxSize;
private long[] stackArray;
private int top;
public StackX(int max) {
maxSize = max;
stackArray = newlong[maxSize];
top = -1;
}
/**
* 入栈
*
* @param value
*/
publicvoid push(long value) {
stackArray[++top] = value;
}
/**
* 出栈
*
* @return
*/
publiclong pop() {
returnstackArray[top--];
}
/**
* 查看
*
* @return
*/
publiclong peek() {
returnstackArray[top];
}
/**
* 判空
*
* @return
*/
publicboolean isEmpty() {
returntop == -1;
}
/**
* 判满
*/
publicboolean isFull() {
returntop == maxSize - 1;
}
}
3.从上面的代码中我们不难看出利用数组进行栈的构造是比较容易的;
4.栈的应用:比如进行单词的逆序,入栈然后进行出栈即可。再比如分隔符的匹配;
5.分隔符的匹配实现
编写的类:
public class BracketChecker {
private String in;
public BracketChecker(String input) {
in = input;
}
publicvoid check() {
int maxSize = in.length();
CharStackX charStackX = new CharStackX(maxSize);
for (int i = 0; i < maxSize; i++) {
char ch = in.charAt(i);
switch (ch) {
case'{':
case'[':
case'(':
charStackX.push(ch);
break;
case'}':
case']':
case')':
if (!charStackX.isEmpty()) {
char chx = charStackX.pop();
System.out.println(chx);
if ((ch == '}' && chx != '{') || (ch == ']' && chx != '[')
|| (ch == ')' && chx != '('))
System.out.println("error" + ch + "at" + i);
} else {
System.out.println("error" + ch + "at" + i);
}
break;
default:
break;
}
}
if(!charStackX.isEmpty()){
System.out.println("error missing right delimiter");
}
}
}
6.队列的定义:先进先出。队列的插入和删除数据的时间复杂度为O(1)
7.入队完成时rear进行加一,出队完成时是front进行加一;
8.队列的简单实现:
public class Queue {
private int max;
private long[] array;
private int front;
private int rear;
private int nItems;
public Queue(int s) {
max = s;
array = newlong[max];
front = 0;
rear = -1;
nItems = 0;
}
publicvoid insert(long value) {
if (rear == max - 1) {
rear = -1;
}
array[++rear] = value;
nItems++;
}
publiclong remove() {
long temp = array[front++];
if (front == max) {
front = 0;
}
nItems--;
return temp;
}
publiclong peekFront() {
returnarray[front];
}
publicboolean isEmpty() {
return (nItems == 0);
}
publicboolean isFull() {
return (nItems == max);
}
publicint size() {
returnnItems;
}
}
9.优先级队列的使用