JAVA数据结构及算法--Stack应用

在《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、分隔符匹配测试程序及结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值