基于数组实现Java 自定义Stack栈类及应用

栈是存放对象的一种特殊容器,在插入与删除对象时,这种结构遵循后进先出( Last-in-first-out,LIFO)的原则。java本身是有自带Stack类包,为了达到学习目的已经更好深入了解stack栈,自己动手自建java stack类是个很好的学习开始:

自建Java Stack 类

Stack 类:

 1 package com.stack;
 2
 3 import java.util.ArrayList;
 4 import java.util.Arrays;
 5
 6 /**
 7  * Stack Class
 8  * @author ganyee
 9  *
10  */
11 public class Stack {
12     //Define capacity constant:CAPACITY
13     private static final int CAPACITY = 1024;
14     //Define capacity
15     private static int capacity;
16     //Define the top position of stack
17     //top = -1 meaning that the stack empty
18     private static int top = -1;
19     //Basic Object class array
20     Object[] array;
21     //Initialize the capacity of stack
22     public Stack() {
23         this.capacity = CAPACITY;
24         array = new Object[capacity];
25     }
26
27     //Get the size of stack
28     public int getSize(){
29         if(isEmpty()){
30             return 0;
31         }else{
32             return top + 1;
33         }
34     }
35
36     //Get whether stack is empty
37     public boolean isEmpty(){
38         return (top < 0);
39     }
40
41     //Get the top element of stack
42     public Object top() throws ExceptionStackEmpty{
43
44         if(isEmpty()){
45             throw new ExceptionStackEmpty("Stack is empty");
46         }
47         return array[top];
48
49     }
50
51     //Push element to stack
52     public void push(Object element) throws ExceptionStackFull{
53            if(getSize()== CAPACITY){
54                throw new ExceptionStackFull("Stack is full");
55            }
56            array[++ top] = element;
57     }
58
59     //Pop element from stack
60     public Object pop() throws ExceptionStackEmpty{
61         if(isEmpty()){
62             throw new ExceptionStackEmpty("Stack is empty");
63         }
64         return array[top --];
65     }
66
67     //Get the all elements of stack
68     public String getAllElements() throws ExceptionStackEmpty{
69         String[] arr = new String[top + 1];
70         if(!isEmpty()){
71             for(int i = 0;i < getSize();i ++){
72                 arr[i] = (String)array[i];
73             }
74         }
75         return Arrays.toString(arr);
76     }
77 }

自定义ExceptionStackEmpty异常类

 1 package com.stack;
 2
 3 public class ExceptionStackEmpty extends Exception {
 4
 5     //Constructor
 6     public ExceptionStackEmpty(){
 7
 8     }
 9
10     //Define myself exception construct with parameters
11     public ExceptionStackEmpty(String string){
12         super(string);
13     }
14 }

自定义ExceptionStackFull异常类

 1 package com.stack;
 2
 3 public class ExceptionStackFull extends Exception {
 4
 5     //Constructor
 6         public ExceptionStackFull(){
 7
 8         }
 9
10         //Define myself exception construct with parameters
11         public ExceptionStackFull(String string){
12             super(string);
13         }
14 }

测试类:

 1 package com.stack;
 2
 3 public class StackTest {
 4
 5     public static void main(String[] args) {
 6         // TODO Auto-generated method stub
 7         Stack stack= new Stack();
 8         System.out.println(stack.getSize());
 9         System.out.println(stack.isEmpty());
10         try {
11             stack.push(8);
12             stack.push(3);
13             stack.push(4);
14             stack.push(7);
15             stack.push(1);
16             stack.push(8);
17             stack.push(3);
18             stack.push(4);
19             stack.push(7);
20             stack.push(1);
21             System.out.println(stack.getSize());
22             System.out.println(stack.top());
23             System.out.println(stack.getAllElements());
24
25             System.out.println(stack.pop());
26             System.out.println(stack.pop());
27             System.out.println(stack.pop());
28             System.out.println(stack.pop());
29             System.out.println(stack.pop());
30             System.out.println(stack.pop());
31             System.out.println(stack.pop());
32             System.out.println(stack.pop());
33             System.out.println(stack.pop());
34             System.out.println(stack.pop());
35
36         } catch (ExceptionStackFull e) {
37             // TODO Auto-generated catch block
38             e.printStackTrace();
39         }catch (ExceptionStackEmpty e) {
40             // TODO Auto-generated catch block
41             e.printStackTrace();
42         }
43     }
44
45 }

测试结果:

0
true
10
1
[8, 3, 4, 7, 1, 8, 3, 4, 7, 1]
1
7
4
3
8
1
7
4
3
8

栈的应用:符号匹配

下面,我们将借助一个栈结构 S,通过对算术表达式自左向右的一遍扫描,检查其中的括号是否匹配。 
假设算术表达式为 X = “x0x1x2…xn-1”,其中 xi 可以是括号、常数、变量名或者算术运算符。我们依次检查 X 中的各个符号,非括号的符号都可以忽略。若遇到左括号,则将其压入栈 S 中;若遇到右括号,则将栈顶符号弹出并与该右括号对比。如果发现某对括号不匹配,或者遇到右括号时栈为空,或者整个表达式扫描过后栈非空,都可以断定括号不匹配。 
在按照以上规则扫描完所有字符后,若栈为空,则说明括号是匹配的。如果按照前面对栈的实现,每一 push()和 pop()操作都只需常数时间,因此对于长度为 n 的算术表达式,上述算法需要运行 O(n)的时间。 
该算法的伪代码描述如 算法二.1 所示:

 1 package com.stack;
 2
 3 public class MatchClass {
 4
 5     public static boolean Match(String str) throws ExceptionStackFull, ExceptionStackEmpty{
 6         Stack stack = new Stack();
 7         str = str.replaceAll(" ","");
 8         char s;
 9         for(int i = 0;i < str.length();i ++){
10             if(str.charAt(i) == ‘(‘ || str.charAt(i) == ‘{‘ || str.charAt(i) == ‘[‘)
11                 stack.push(str.charAt(i));
12             else{
13                 if(stack.isEmpty())
14                     return false;
15                 else{
16                     s = str.charAt(i);
17                     switch(s){
18                     case ‘)‘:
19                         if((Character)stack.pop() != ‘(‘)
20                             return false;
21                         break;
22                     case ‘}‘:
23                         if((Character)stack.pop() != ‘{‘)
24                             return false;
25                         break;
26                     case ‘]‘:
27                         if((Character)stack.pop() != ‘[‘)
28                             return false;
29                         break;
30                     }
31                 }
32
33             }
34         }
35         if(stack.isEmpty()){
36             return true;
37         }else{
38             return false;
39         }
40     }
41 }
 1 package com.stack;
 2
 3 public class ParentMatch {
 4
 5     public static void main(String[] args) {
 6
 7         MatchClass match = new MatchClass();
 8         //String str = "()({})";  //Match
 9         //String str = "()({}) {([()[]])}";//Match
10         //String str = "([]{)";//Not match
11         //String str = ")([()] {}";//Not match
12         String str = "([())]{}";//Not match
13         try {
14             if(!match.Match(str)){
15                 System.out.println(str + ": Not Macth");
16             }else{
17                 System.out.println(str + ": Macth");
18             }
19         } catch (ExceptionStackFull e) {
20             // TODO Auto-generated catch block
21             e.printStackTrace();
22         } catch (ExceptionStackEmpty e) {
23             // TODO Auto-generated catch block
24             e.printStackTrace();
25         }
26     }
27
28 }

测试结果:

()({}): Macth
()({}) {([()[]])}: Macth
([]{): Not Macth
)([()] {}: Not Macth
([())]{}: Not Macth
时间: 2024-12-19 23:04:09

基于数组实现Java 自定义Stack栈类及应用的相关文章

Java 自定义Stack栈类及应用

栈是存放对象的一种特殊容器,在插入与删除对象时,这种结构遵循后进先出( Last-in-first-out,LIFO)的原则.java本身是有自带Stack类包,为了达到学习目的已经更好深入了解stack栈,自己动手自建java stack类是个很好的学习开始: 自建Java Stack 类 Stack 类: package com.stack; import java.util.ArrayList; import java.util.Arrays; /** * Stack Class * @a

java集合类——Stack栈类

今日走读代码时,遇到stack栈类,特查看java的API文档,总结如下: Stack继承Vector类. 栈的特点是后进先出. API中Stack自身的方法不多,基本跟栈的特点有关. 现附上例子,后续继续总结 /** * @作者 whs * @创建日期 2015年2月4日 * @版本 V 1.0 */ package thread.pool; import java.util.Stack; public class StackExam { public static void main(Str

基于数组实现Java 自定义Queue队列及应用

Java 自定义队列Queue: 队列的抽象数据类型就是一个容器,其中的对象排成一个序列,我们只能访问和取出排在最前端( Front)的对象,只能在队列的尾部( Rear)插入新对象.正是按照这一规则,才能保证最先被插入的对象首先被删除( FIFO).java本身是有自带Queue类包,为了达到学习目的已经更好深入了解Queue队列,自己动手自建java Queue类是个很好的学习开始: 基于数组的实现 ? 顺序数组 借助一个定长数组 Q 来存放对象,即可简单地实现队列.那么,为了符合 FIFO

基于链表实现Java 自定义Stack队列

接下来让我们看看,如何利用单链表结构来实现栈与队列.由于栈的操作只限于栈顶元素,而单链表只有对首元素才能在O(1)时间内完成插入和删除,故这里把单链表的首节点作为栈顶,其余元素依次排列.此外,为了保证getSize()方法也能够在O(1)时间内完成,还需借助一个实例变量来动态记录栈中元素的数目.具体的实现如 代码二.12 所示. Node类 Java代码见( Java 实现链表) StackLink 类: package com.list.stack; import java.util.Arra

java数组与java.util.Arrays工具类

概念 Java中数组属于引用类型.数组使用场合较多,对于数组的操作具有一定重复性,例如:数组拷贝,转换字符串,转换成数组,排序等等.既然重复的操作与需求多,那么对于数组操作的支持就成了JDK中的一大需求.java.util.Arrays中提供了很多对数组操作的支持. System.arraycopy: 数组元素拷贝 public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int l

基于链表实现Java 自定义Queue队列

与栈一样,我们也可以借助单链表来实现队列ADT.同样地,出于效率方面的考虑,我们将以单链表的首(末)节点作为队列的首(末)节点??这样,可以回避单链表在尾部进行删除操作时效率低下的缺陷.此外,还需要两个实例变量分别指示表的首.末节点. java代码如下: QueueList: package com.list.queue; import java.util.Arrays; import com.list.stack.Node; import com.list.stack.ExceptionSta

Java的Stack类实现List接口真的是个笑话吗

今天在网上闲逛时看到了这样一个言论,说“Java的Stack类实现List接口的设计是个笑话”. 当然作者这篇文章的重点不是这个,原本我也只是一笑置之,然而看评论里居然还有人附和,说“Java那种Stack的设计作为笑话,差不多可以算公案了”,我就有点不淡定了,为什么.什么时候“作为笑话”的并且“差不多可以算公案”了呢? 因此我决定写一篇文章来谈谈这个问题. 接口是什么 狭义地讲,接口就是一个类所定义的方法(方法名.参数.返回值).一个类提供了Foo方法,其他类就可以调用它.广义上讲,接口可以理

Java 基于数组自定义实现容量不可变向量Vector

背景:假定集合 S 由 n 个元素组成,它们按照线性次序存放,于是我们就可以直接访问其中的第一个元素.第二个元素.第三个元素--.也就是说,通过[0, n-1]之间的每一个整数,都可以直接访问到唯一的元素 e,而这个整数就等于 S 中位于 e 之前的元素个数??在此,我们称之为该元素的秩( Rank).不难看出,若元素 e 的秩为 r,则只要 e 的直接前驱(或直接后继)存在,其秩就是 r-1(或 r+1).这一定义与 Java. C++之类的程序语言中关于数组元素的编号规则是一致的.支持通过秩

基于数组的栈(Java)

package com.rao.linkList; /** * @author Srao * @className ArrayStack * @date 2019/12/3 13:41 * @package com.rao.linkList * @Description 基于数组的栈 */ public class ArrayStack { private String[] items; //栈中的数据 private int count; //当前栈中元素的个数 private int n;