在《JAVA数据结构及算法--Stack分析》这篇文章中分析了源码Stack是怎么实现的,接下来要分析怎么自己去实现栈,栈有那些应用。本章内容主要参考于《Java数据结构和算法第二版》这本书。
1、通过基本数据类型long数组实现栈。
package stack;
/**
* 通过long的数组实现自定义的栈
*
*/
public class StackX {
private int maxSize;//size of stack array
private long[] stackArray;
private int top; //top of stack
//初始化栈,s是栈的大小
public StackX(int s){
maxSize = s;//set array size
stackArray = new long[maxSize]; //create array
top = -1;// no items yet
}
//将item压入栈顶
public void push(long item) {// put item on top of stack
stackArray[++top] = item; //increment top, insert item
}
//将栈顶元素弹出并删除栈顶元素
public long pop() {//take item from top of stack
return stackArray[top--];//access item, decrement top
}
//将栈顶元素弹出,不会删除栈顶元素
public long peek(){//peek at top of stack
return stackArray[top];
}
//判断栈是否为空
public boolean isEmpty(){//true if stack is empty
return top == -1;
}
//判断栈是否满了
public boolean isFull(){//true if stack is full
return top == maxSize - 1;
}
//返回栈顶位置
public int getTop(){
return top;
}
}
2、测试上面实现StackX栈。
3、栈的应用。通过栈实现单词的逆序,即输入一个字符串,然后逆序输出这个字符串。实现原理是字母从输入的字符串中一个接一个地提取出来并且压入栈中。接着他们一次次弹出栈,并且显示出来。因为栈的后进先出(LIFO)的特性,所以字母的顺序就颠倒过来。这里的栈StackE使用了泛型,跟上面的栈StackX有一点点不同,泛型可以适配更多的数据类型。
package stack;
/**
* 通过Object的数组实现自定义的栈
*
*/
public class StackE<E> {
private int maxSize;//size of stack array
private Object[] stackArray;
private int top; //top of stack
//初始化栈,s是栈的大小
public StackE(int s){
maxSize = s;//set array size
stackArray = new Object[maxSize]; //create array
top = -1;// no items yet
}
//将item压入栈顶
public void push(E item) {// put item on top of stack
stackArray[++top] = item; //increment top, insert item
}
//将栈顶元素弹出并删除栈顶元素
public E pop() {//take item from top of stack
return (E) stackArray[top--];//access item, decrement top
}
//将栈顶元素弹出,不会删除栈顶元素
public E peek(){//peek at top of stack
return (E) stackArray[top];
}
//判断栈是否为空
public boolean isEmpty(){//true if stack is empty
return top == -1;
}
//判断栈是否满了
public boolean isFull(){//true if stack is full
return top == maxSize - 1;
}
//返回栈顶位置
public int getTop(){
return top;
}
}
package stack;
public class Reverser {
private String input;//input string
private String output;//output string
public Reverser(String in){//constructor
input = in;
}
public String doRev(){//reverse the string
int stackSize = input.length();// get max stack size
StackE<String> stackX = new StackE<String>(stackSize);// make stack
String tmp = "";
for (int i = 0; i < input.length(); i++){
char ich = input.charAt(i); //get a char from input
tmp += ich;
stackX.push(tmp); // push ch stack
tmp = "";
}
output = "";
while (!stackX.isEmpty()){
String och = stackX.pop(); //pop a char
output += och; // append to output
}
return output;
}
}
4、单词逆序测试程序及结果如下:
package stack;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Util {
public static String getString() throws IOException{
InputStreamReader isr = new InputStreamReader(System.in);//从键盘输入
BufferedReader br = new BufferedReader(isr);
String s = br.readLine();
return s;
}
}
5、通过栈StackE实现分隔符匹配。分隔符匹配程序从字符串中不断地读取字符,每次读取一个字符。如发现它是左分隔符,将它压入栈中。当从输入中读到一个右分隔符时,弹出栈顶的左分隔符,并且查看它是否和右分隔符相匹配。如果它们不匹配,则程序报错。如果栈中没有左分隔符和右分隔符匹配,或者一直存在着没有被匹配的分隔符,程序也报错。分隔符没有被匹配,表现为把所有的字符读入后,栈中还留有分隔符。
package stack;
public class BracketChecker {
private String input;//input string
public BracketChecker(String in){//constructor
input = in;
}
public void check(){
int stackSize = input.length();//get max stack size
StackE<String> stackE = new StackE<String>(stackSize); //make stack
for(int i = 0; i < input.length(); i++){
char ch = input.charAt(i);
switch (ch) {
case '{':
case '[':
case '(':
stackE.push(ch+"");//左分隔符入栈
break;
case '}':
case ']':
case ')':
if (!stackE.isEmpty()){
char pch = stackE.pop().charAt(0);//左分隔符出栈
//判断右分隔符跟左分隔符是否匹配
if ((ch == '}' && pch != '{') ||
(ch == ']' && pch != '[') ||
(ch == ')' && pch != '('))
System.out.println("Error: " + ch + " at " + i);//打印不匹配的右分隔符及在字符串中对应的位置
}else{
System.out.println("Error: " + ch + " at " + i);
}
default:
break;
}//end switch
}//end for
if (!stackE.isEmpty()){
System.out.println("Error: missing right delimiter");
}
}
}
6、分隔符匹配测试程序及结果: