一、涉及的内容大纲
二、简单介绍栈、队列和其他数据结构的不同
1 对于其他的数据结构而言,都适用与数据库应用中作数据记录。但是因为栈和队列的生命周期比那些数据库类型的数据结构要短,所以他们只是在程序的操作期间才会创建和执行,在完成任务之后就会被销毁。所以栈和队列更多的是用于构思算法的辅助工具。
2 栈和队列的访问是受限制的,因为在这些结构接口设计时就增强了这种受限访问。
3 栈的主要机制可以用数组来实现,但也可以利用链表来实现。在优先级队列中,内部的实现可以用数组,也可以用一种特别的树——堆来实现。
三、栈
栈的特点:只允许访问最后插入的数据项,移除这个数据项后,才可以访问倒数第二个插入的数据项。简单说就是,先进后出。
栈的基础操作:压栈和弹栈
public class MyStack {
//设定数组的范围
private int maxSize;
//创建数组
private long[] stackArray;
//设置栈顶的位置
private int top;
//带参构造方法,初始化各个参数
public MyStack(int s) {
maxSize = s;
stackArray = new long[maxSize];
//将栈顶的值设置为-1,为了在压入第一个值时,栈顶正好在下标0
top = -1;
}
/**
* 压栈
* @param j
*/
public void push(long j) {
//先对栈顶的下标值增加,然后赋给数组
stackArray[++top] = j;
}
/**
* 弹栈
* @return
*/
public long pop() {
//先将栈顶的值弹出,再将栈顶的下标减一
return stackArray[top--];
}
/**
* 返回栈顶的值
* @return
*/
public long peek() {
return stackArray[top];
}
/**
* 检查栈是否为空
* @return
*/
public boolean isEmpty() {
return (top == -1);
}
/**
* 检查栈是否已经满了
* @return
*/
public boolean isFull() {
return (top == maxSize - 1);
}
}
测试类
/**
* MyStack类的测试类
*/
public class StackApp {
public static void main(String[] args) {
MyStack ms = new MyStack(10);
ms.push(10);
ms.push(20);
ms.push(30);
ms.push(40);
ms.push(50);
while(!ms.isEmpty()) {
System.out.print(ms.pop() + " ");
}
System.out.println("");
}
}
/**
* 运行结果:
* 50 40 30 20 10
*/
从上面的运行结果可以看出,输出的结果很输入的结果顺序相反。
栈的简单运用实例1:单词逆序
主要思想:对单词的输入和输出采用栈的方式,就可以实现逆序
代码如下:
/**
* 实现对单词的逆序
*/
public class ReverseWords {
//单词的输入
private String input;
//单词逆序后的输出
private String output;
//带参构造实现数据的输入
public ReverseWords(String in) {
input = in;
}
/**
* 单词逆序
* @return
*/
public String Reverse() {
//设置栈的大小
int stackSize = input.length();
MyStack ms = new MyStack(stackSize);
//将输入的每一个单词的每个字母压入到栈中
for (int i = 0; i < stackSize; i++) {
char ch = input.charAt(i);
ms.push(ch);
}
output = "";
//将每一个字符弹出栈中
while(!ms.isEmpty()) {
//long类型转换成char类型需要进行强制转化
char ch = (char)ms.pop();
output += ch;
}
//返回逆序后的单词
return output;
}
}
测试类
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* 单词逆序的测试类
*/
public class ReverseWordsApp {
public static void main(String[] args) throws IOException {
String input, output;
while(true) {
System.out.println("请输入一个单词:");
System.out.flush();
input = getString();
if (input.equals("")) {
break;
}
ReverseWords rw = new ReverseWords(input);
output= rw.Reverse();
System.out.println("逆序后的单词是:" + output);
}
}
/**
* 实现用户输入的读取
* @return
* @throws IOException
*/
public static String getString() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
return s;
}
}
/*
* 运行结果
* 请输入一个单词:
word
逆序后的单词是:drow
*/
栈的简单运用实例2:分隔符的匹配
分隔符匹配类,代码如下:
/**
* 分隔符的匹配实现
*/
public class BracketChecker {
private String input;
public BracketChecker(String in) {
input = in;
}
public void check() {
//设置栈的大小
int stackSize = input.length();
MyStack ms = new MyStack(stackSize);
//对输入的字符串进行字符遍历
for (int i = 0; i < stackSize; i++) {
char ch = input.charAt(i);
switch(ch) {
case '{':
case '[':
case '('://如果是碰到左匹配符,就压入栈中
ms.push(ch);
break;
case '}':
case ']':
case ')':
if (!ms.isEmpty()) {
//只有栈中有左匹配符才进入进行匹配
//将栈顶的字符弹出
char chx = (char)ms.pop();
if ((ch == '}' && chx != '{') ||
(ch == ']' && chx != '[') ||
(ch == ')' && chx != '(')) {
//如果现在的右匹配符与弹出的左匹配符不相匹配,报错
System.out.println("括号匹配错误:" + ch + " 在 " + i);
}
}else {
//说明栈中没有任何匹配符,但有右括号需要匹配
System.out.println("缺少左括号,右括号匹配错误:" + ch + " 在 " + i);
}
break;
default:
break;
}
}
if(!ms.isEmpty()) {
//如果栈中还有匹配符存在,说明左匹配符未完全被弹出,所以缺少右匹配符
System.out.println("错误:缺少右匹配括号");
}
}
}
测试类
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* 分隔符匹配的测试类
*/
public class BrackerApp {
public static void main(String[] args) throws IOException {
String input;
while(true) {
System.out.println("请输入带有分割符的字符串:");
System.out.flush();
input = getString();
if (input.equals("")) {
break;
}
BracketChecker bc = new BracketChecker(input);
bc.check();
}
}
/**
* 实现用户输入的读取
* @return
* @throws IOException
*/
public static String getString() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
return s;
}
}
/*
* 运行结果
* 请输入带有分割符的字符串:
a{b[c(d)f]ge
错误:缺少右匹配括号
*/
队列