栈
- 用数组实现一个顺序栈
1.数组实现一个顺序栈
接口
package stack;
interface IStack<T> {
//出栈
public T pop();
//入栈
public void push(T element) throws Exception;
//获取栈顶元素
public T top() throws Exception;
//判断栈为空
public boolean isEmpty();
//判断是否溢栈
public boolean isFull();
//获取栈长度
public int getLength();
//清空
public void setEmpty();
}
实现类package stack;
import java.util.Arrays;
class AStack<T> implements IStack {
//定义栈空间
private final int STACK_DEFAULT_SIZE=3;
//栈最大值
private int max_size;
//栈数组
private T[] arrayObj;
//栈顶指针,初始为-1
private int top=-1;
/*
*默认的构造函数
* */
public AStack(){
this.max_size=STACK_DEFAULT_SIZE;
this.arrayObj=(T[]) new Object[this.max_size];
top=-1;
}
/*
* 带初始值的构造函数
* @param=size
* */
public AStack(int size){
this.max_size=size;
this.arrayObj=(T[]) new Object[this.max_size];
top=-1;
}
/*
* 出栈
* 判断栈是否为空,不为空则将top指针下的元素返回,并将该位置清空,top--;
* */
@Override
public Object pop() {
if(isEmpty()){
System.out.println("栈为空");
return null;
}
T result=(T) arrayObj[top];
arrayObj[top]=null;
top--;
return result;
}
/*
* 入栈,首先判断入栈元素是否为空,不为空则入栈成功
*其次,判断栈是否为满,若未满则入栈失败,将元素存入数组,top++
* */
@Override
public void push(Object element) throws Exception {
if(null==element){
throw new Exception("入栈元素不能为空");
}
if (isFull()){
System.out.println("栈满!");
}else{
this.arrayObj[++top]= (T) element;
}
}
/*
* 获取栈顶元素,首先判断栈是否为空,若为空则抛出异常
*若不为空则返回top指针下的元素
* */
@Override
public Object top() throws Exception {
if(isEmpty()){
throw new Exception("栈为空");
}else{
return this.arrayObj[top];
}
}
/*
* 判断栈为空
* * */
@Override
public boolean isEmpty() {
if(top == -1){
return true;
}
return false;
}
/*
* 判断栈溢出
* */
@Override
public boolean isFull() {
if(top == arrayObj.length-1){
return true;
}
return false;
}
/*
* 获取当前栈所存元素的长度
* */
@Override
public int getLength() {
return this.top;
}
/*
* 清空栈
* */
@Override
public void setEmpty() {
//将数组置空
Arrays.fill(arrayObj,null);
//指针归位
this.top=-1;
this.max_size=this.STACK_DEFAULT_SIZE;
this.arrayObj=(T[]) new Object[max_size];
}
}
- 用链表实现一个链式栈
package stack;
interface IStack<T> {
//出栈
public T pop();
//入栈
public void push(T element) throws Exception;
//获取栈顶元素
public T top() throws Exception;
//判断栈为空
public boolean isEmpty();
//判断是否溢栈
public boolean isFull();
//获取栈长度
public int getLength();
//清空
public void setEmpty();
}
package stack;
import java.util.Arrays;
class AStack<T> implements IStack {
//定义栈空间
private final int STACK_DEFAULT_SIZE=3;
//栈最大值
private int max_size;
//栈数组
private T[] arrayObj;
//栈顶指针,初始为-1
private int top=-1;
/*
*默认的构造函数
* */
public AStack(){
this.max_size=STACK_DEFAULT_SIZE;
this.arrayObj=(T[]) new Object[this.max_size];
top=-1;
}
/*
* 带初始值的构造函数
* @param=size
* */
public AStack(int size){
this.max_size=size;
this.arrayObj=(T[]) new Object[this.max_size];
top=-1;
}
/*
* 出栈
* 判断栈是否为空,不为空则将top指针下的元素返回,并将该位置清空,top--;
* */
@Override
public Object pop() {
if(isEmpty()){
System.out.println("栈为空");
return null;
}
T result=(T) arrayObj[top];
arrayObj[top]=null;
top--;
return result;
}
/*
* 入栈,首先判断入栈元素是否为空,不为空则入栈成功
*其次,判断栈是否为满,若未满则入栈失败,将元素存入数组,top++
* */
@Override
public void push(Object element) throws Exception {
if(null==element){
throw new Exception("入栈元素不能为空");
}
if (isFull()){
System.out.println("栈满!");
}else{
this.arrayObj[++top]= (T) element;
}
}
/*
* 获取栈顶元素,首先判断栈是否为空,若为空则抛出异常
*若不为空则返回top指针下的元素
* */
@Override
public Object top() throws Exception {
if(isEmpty()){
throw new Exception("栈为空");
}else{
return this.arrayObj[top];
}
}
/*
* 判断栈为空
* * */
@Override
public boolean isEmpty() {
if(top == -1){
return true;
}
return false;
}
/*
* 判断栈溢出
* */
@Override
public boolean isFull() {
if(top == arrayObj.length-1){
return true;
}
return false;
}
/*
* 获取当前栈所存元素的长度
* */
@Override
public int getLength() {
return this.top;
}
/*
* 清空栈
* */
@Override
public void setEmpty() {
//将数组置空
Arrays.fill(arrayObj,null);
//指针归位
this.top=-1;
this.max_size=this.STACK_DEFAULT_SIZE;
this.arrayObj=(T[]) new Object[max_size];
}
}
- 编程模拟实现一个浏览器的前进、后退功能
package stack;
import java.util.Scanner;
public class BracketMatchSolution {
public static void main(String[] args) throws Exception{
AStack<Character> stack=null;
//用户输入
Scanner scanner = new Scanner(System.in);
String str=scanner.next();
//关闭输入流
scanner.close();
if(null == str || str.equals("")){
System.out.println("输入错误!");
}else{
//若输入为奇数,则未匹配成功
if(str.length()%2==1){
System.out.println("不匹配");
}else{
//创建自定义的栈对象
stack = new AStack<Character>(100);
//对单个字符进行判断
for (int i=0;i<str.length();i++){
//当栈为空时,压入栈
if(stack.isEmpty()){
stack.push(str.charAt(i));
}else{
//栈不为空时,获取栈顶元素与当前元素进行匹配,成功则出栈,不成功则入栈
if((char)(stack.top())=='('&&str.charAt(i)==')'||
(char)(stack.top())=='['&&str.charAt(i)==']'||
(char)(stack.top())=='{'&&str.charAt(i)=='}'){
stack.pop();
}else{
stack.push(str.charAt(i));
}
}
}
}
}
if (stack.isEmpty()){
System.out.println("匹配成功");
}else{
System.out.println("匹配失败");
}
}
}