码迷,mamicode.com
首页 > 编程语言 > 详细

Java实现栈和队列

时间:2018-01-01 20:36:56      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:lis   ati   栈的链式存储   arch   als   illegal   empty   一个   node   

栈:LIFO(后进先出)

队列:FIFO(先进先出)

栈的顺序存储结构实现:

* top:栈顶指针,初始化top=-1
* 入栈:data[++top]=e
* 出栈:(E)data[top--]
* 得到栈顶元素:(E)data[top]
* 空:top=-1

 

 

 1 package com.myutil.stack;
 2 
 3 /**
 4  * 基于数组实现的顺序栈
 5  * @param <E>
 6  * 
 7  * top:栈顶指针,初始化top=-1
 8  * 入栈:data[++top]=e
 9  * 出栈:(E)data[top--]
10  * 得到栈顶元素:(E)data[top]
11  * 空:top=-1
12  */
13 public class Stack<E> {
14     private Object[] data = null;
15     private int maxSize=0;   //栈容量
16     private int top =-1;  //栈顶指针
17     
18     /**
19      * 构造函数:根据给定的size初始化栈
20      */
21     Stack(){
22         this(10);   //默认栈大小为10
23     }
24     
25     Stack(int initialSize){
26         if(initialSize >=0){
27             this.maxSize = initialSize;
28             data = new Object[initialSize];
29             top = -1;
30         }else{
31             throw new RuntimeException("初始化大小不能小于0:" + initialSize);
32         }
33     }
34     
35     
36     
37     //进栈,第一个元素top=0;
38     public boolean push(E e){
39         if(top == maxSize -1){
40             throw new RuntimeException("栈已满,无法将元素入栈!");
41         }else{
42             data[++top]=e;
43             return true;
44         }    
45     }
46     
47     //查看栈顶元素但不移除
48     public E peek(){
49         if(top == -1){
50             throw new RuntimeException("栈为空!");
51         }else{
52             return (E)data[top];
53         }
54     }
55     
56     //弹出栈顶元素
57     public E pop(){
58         if(top == -1){
59             throw new RuntimeException("栈为空!");
60         }else{
61             return (E)data[top--];
62         }
63     }
64     
65     //判空
66     public boolean empty(){
67         return top==-1 ? true : false;
68     }
69     
70     //返回对象在堆栈中的位置,以 1 为基数
71     public int search(E e){
72         int i=top;
73         while(top != -1){
74             if(peek() != e){
75                 top --;
76             }else{
77                 break;
78             }
79         }
80         int result = top+1;
81         top = i;
82         return result;      
83     }
84     
85     public static void main(String[] args) {
86         Stack<Integer> stack=new Stack<>();
87         for (int i = 0; i < 5; i++) {
88             stack.push(i);
89         }
90         for (int i = 0; i < 5; i++) {
91             System.out.print(stack.pop()+" ");
92         }
93     }
94 }

 

 

栈的链式存储结构实现:

 1 package com.myutil.stack;
 2 
 3 public class LinkStack<E> {
 4     //链栈的节点
 5     private class Node<E>{
 6         E e;
 7         Node<E> next;
 8         
 9         public Node(){}
10         public Node(E e, Node next){
11             this.e = e;
12             this.next = next;
13         }
14     }
15     
16     private Node<E> top;   //栈顶元素
17     private int size;  //当前栈大小
18     
19     public LinkStack(){
20         top = null;
21     }
22     
23     
24     
25     //入栈:让top指向新创建的元素,新元素的next引用指向原来的栈顶元素
26     public boolean push(E e){
27         top = new Node(e,top);
28         size ++;
29         return true;
30     }
31     
32     //查看栈顶元素但不删除
33     public Node<E> peek(){
34         if(empty()){
35             throw new RuntimeException("空栈异常!");
36         }else{
37             return top;
38         }
39     }
40     
41     //出栈
42     public Node<E> pop(){
43         if(empty()){
44             throw new RuntimeException("空栈异常!");
45         }else{
46             Node<E> value = top; //得到栈顶元素
47             top = top.next; //让top引用指向原栈顶元素的下一个元素 
48             value.next = null;  //释放原栈顶元素的next引用
49             size --;
50             return value;
51         }
52     }
53     
54   //当前栈大小
55     public int length(){
56         return size;
57     }
58     
59     //判空
60     public boolean empty(){
61         return size==0;
62     }
63     
64     public static void main(String[] args) {
65         LinkStack<Integer> stack=new LinkStack<>();
66         for (int i = 0; i < 5; i++) {
67             stack.push(i);
68         }
69         for (int i = 0; i < 5; i++) {
70             System.out.print(stack.pop().e+" ");
71         }
72     }
73 }

 

基于LinkedList实现的栈结构:

 

 * push-----addFirst()
 * pop------removeFirst()
 * peek-----getFirst()
 * empty----isEmpty()
 1 package com.myutil.stack;
 2 
 3 import java.util.LinkedList;
 4 
 5 /**
 6  * 基于LinkedList实现栈
 7  * 在LinkedList实力中只选择部分基于栈实现的接口
 8  * 
 9  * push-----addFirst()
10  * pop------removeFirst()
11  * peek-----getFirst()
12  * empty----isEmpty()
13  */
14 public class StackList<E> {
15     private LinkedList<E> ll = new LinkedList<E>();
16     
17     //入栈
18     public void push(E e){
19         ll.addFirst(e);
20     }
21     
22     //查看栈顶元素但不移除
23     public E peek(){
24         return ll.getFirst();
25     }
26     
27     //出栈
28     public E pop(){
29         return ll.removeFirst();
30     }
31     
32     //判空
33     public boolean empty(){
34         return ll.isEmpty();
35     }
36     
37     //打印栈元素
38     public String toString(){
39         return ll.toString();
40     }
41     
42     public static void main(String[] args) {
43         StackList<Integer> stack=new StackList<>();
44         for (int i = 0; i < 5; i++) {
45             stack.push(i);
46         }
47         System.out.println(stack.toString());
48         for (int i = 0; i < 5; i++) {
49             System.out.print(stack.pop()+" ");
50         }
51     }
52 }

 

 

队列的顺序存储结构实现

 * 入队:rear=rear+1,data[rear]=e
 * 出队:front=front+1,E value=(E)data[front],data[front]=null
 * 得到对首元素:(E)data[front+1];
 * 判断对空:rear==front
 * 对长:rear-front

 

 

 1 package com.myutil.queue;
 2 
 3 /*
 4  * 设置两个指针,头指针front和尾指针rear
 5  * 规定front总是指向当前队头元素的前一个位置,rear指向当前队尾元素的位置
 6  * 初始化front=rear=-1
 7  * 
 8  * 入队:rear=rear+1,data[rear]=e
 9  * 出队:front=front+1,E value=(E)data[front],data[front]=null
10  * 得到对首元素:(E)data[front+1];
11  * 判断对空:rear==front
12  * 对长:rear-front
13  */
14 
15 public class Queue<E> {
16     private Object[] data=null;
17     private int maxSize; //队列容量
18     private int front;  //队列头,允许删除
19     private int rear;   //队列尾,允许插入
20 
21     //构造函数
22     public Queue(){
23         this(10);
24     }
25     
26     public Queue(int initialSize){
27         if(initialSize >=0){
28             this.maxSize = initialSize;
29             data = new Object[initialSize];
30             front = rear =-1;
31         }else{
32             throw new RuntimeException("初始化大小不能小于0:" + initialSize);
33         }
34     }
35     
36     
37     
38     //插入
39     public boolean add(E e){
40         if(rear== maxSize-1){
41             throw new RuntimeException("队列已满,无法插入新的元素!");
42         }else{
43             data[++rear]=e;
44             return true;
45         }
46     }
47     
48     //返回队首元素,但不删除
49     public E peek(){
50         if(empty()){
51             throw new RuntimeException("空队列异常!");
52         }else{
53             
54             return (E) data[front+1];
55         }    
56     }
57     
58     //出队
59     public E poll(){
60         if(empty()){
61             throw new RuntimeException("空队列异常!");
62         }else{
63             E value = (E) data[++front];  //保留队列的front端的元素的值
64             data[front] = null;     //释放队列的front端的元素                
65             return value;
66             
67             /*front=front+1;
68             E value=(E) data[front];
69             return value;*/
70         }            
71     }
72     
73     //队列长度
74     public int length(){
75         return rear-front;
76     }
77     
78   //判空
79     public boolean empty(){
80         return rear==front?true:false;
81     }
82     
83     public static void main(String[] args) {
84         Queue<Integer> queue=new Queue<>();
85         for (int i = 0; i < 5; i++) {
86             queue.add(i);
87         }
88         for (int i = 0; i < queue.length(); i++) {
89             System.out.print(queue.peek()+" ");
90         }
91         System.out.println();
92         int size=queue.length();
93         for (int i = 0; i < size; i++) {
94             System.out.print(queue.poll()+" ");
95         }
96     }
97 }

 

 

循环队列的顺序存储结构实现

 * 入队:rear=(rear+1)%maxSize,data[rear]=e
 * 出队:front = (front+1)%maxSize; E value =(E)data[front]; data[front] = null; 
 * 得到对首元素:(E)data[front+1];
 * 判断对空:rear==front
 * 对长:rear-front

 

 

 1 package com.myutil.queue;
 2 
 3 /*
 4  * 入队:rear=(rear+1)%maxSize,data[rear]=e
 5  * 出队:front = (front+1)%maxSize; E value =(E)data[front]; data[front] = null; 
 6  * 得到对首元素:(E)data[front+1];
 7  * 判断对空:rear==front
 8  * 对长:rear-front
 9  */
10 import java.util.Arrays;
11 
12 public class LoopQueue<E> {
13     public Object[] data = null;
14     private int maxSize; // 队列容量
15     private int rear;// 队列尾,允许插入
16     private int front;// 队列头,允许删除
17     //private int size=0; //队列当前长度
18 
19     public LoopQueue() {
20         this(10);
21     }
22 
23     public LoopQueue(int initialSize) {
24         if (initialSize >= 0) {
25             this.maxSize = initialSize;
26             data = new Object[initialSize];
27             front = rear = -1;
28         } else {
29             throw new RuntimeException("初始化大小不能小于0:" + initialSize);
30         }
31     }
32 
33     
34     // 插入
35     public boolean add(E e) {
36         if ((rear+1)%maxSize==front) {
37             throw new RuntimeException("队列已满,无法插入新的元素!");
38         } else {
39             rear = (rear + 1)%maxSize;
40             data[rear] = e;
41             return true;
42         }
43     }
44 
45     // 返回队首元素,但不删除
46     public E peek() {
47         if (empty()) {
48             throw new RuntimeException("空队列异常!");
49         } else {
50             return (E) data[front+1];
51         }
52     }
53 
54     // 出队
55     public E poll() {
56         if (empty()) {
57             throw new RuntimeException("空队列异常!");
58         } else {
59             front = (front+1)%maxSize;  //队首指针加1
60             E value = (E) data[front]; // 保留队列的front端的元素的值
61             data[front] = null; // 释放队列的front端的元素
62             return value;
63         }
64     }
65 
66     // 队列长度
67     public int length() {
68         return rear-front;
69     }
70     
71  // 判空
72     public boolean empty() {
73         return rear==front;
74     }
75 
76 
77     //清空循环队列
78     public void clear(){
79         Arrays.fill(data, null);
80         front = -1;
81         rear = -1;
82     }
83     
84     public static void main(String[] args) {
85         LoopQueue<Integer> queue=new LoopQueue<>();
86         for (int i = 0; i < 5; i++) {
87             queue.add(i);
88         }
89         for (int i = 0; i < queue.length(); i++) {
90             System.out.print(queue.peek()+" ");
91         }
92         System.out.println();
93         int size=queue.length();
94         for (int i = 0; i < size; i++) {
95             System.out.print(queue.poll()+" ");
96         }
97     }
98 }

 

 

队列的链式存储结构实现

 1 package com.myutil.queue;
 2 
 3 public class LinkQueue<E> {
 4     // 链栈的节点
 5     private class Node<E> {
 6         E e;
 7         Node<E> next;
 8 
 9         public Node() {
10         }
11 
12         public Node(E e, Node next) {
13             this.e = e;
14             this.next = next;
15         }
16         
17     }
18     
19     private Node front;// 队列头,允许删除  
20     private Node rear;// 队列尾,允许插入  
21     private int size; //队列当前长度 
22     
23     public LinkQueue() {
24         front = null;
25         rear = null;
26     }
27     
28     //判空
29       public boolean empty(){
30           return size==0;
31       }
32       
33       //插入
34       public boolean add(E e){
35           if(empty()){    //如果队列为空
36               front = new Node(e,null);//只有一个节点,front、rear都指向该节点
37               rear = front;
38           }else{
39               Node<E> newNode = new Node<E>(e, null);
40               rear.next = newNode; //让尾节点的next指向新增的节点
41               rear = newNode; //以新节点作为新的尾节点
42           }
43           size ++;
44           return true;
45       }
46       
47       //返回队首元素,但不删除
48       public Node<E> peek(){
49           if(empty()){
50               throw new RuntimeException("空队列异常!");
51           }else{
52               return front;
53           }
54       }
55       
56       //出队
57       public Node<E> poll(){
58           if(empty()){
59               throw new RuntimeException("空队列异常!");
60           }else{
61               Node<E> value = front; //得到队列头元素
62               front = front.next;//让front引用指向原队列头元素的下一个元素
63               value.next = null; //释放原队列头元素的next引用
64               size --;
65               return value;
66           }        
67       }
68       
69       //队列长度
70       public int length(){
71           return size;
72       }
73       
74       public static void main(String[] args) {
75           LinkQueue<Integer> queue=new LinkQueue<>();
76           for (int i = 0; i < 5; i++) {
77               queue.add(i);
78           }
79           for (int i = 0; i < queue.length(); i++) {
80               System.out.print(queue.peek().e+" ");
81           }
82           System.out.println();
83           int size=queue.length();
84           for (int i = 0; i < size; i++) {
85               System.out.print(queue.poll().e+" ");
86           }
87       }
88 }

 

 

基于LinkedList实现队列结构

 * 使用java.util.Queue接口,其底层关联到一个LinkedList(双端队列)实例.
 * 
 * add----add()            会抛出异常
 * offer-----offer()
 * 
 * element-----element() 对为空,返回异常
 * peek------peek()
 * 
 * remove----remove() 对为空,返回异常
 * poll------poll()
 * 
 * empty-----isEmpty()

 

 

 1 package com.myutil.queue;
 2 
 3 /**
 4  * 使用java.util.Queue接口,其底层关联到一个LinkedList(双端队列)实例.
 5  * 
 6  * add----add()            会抛出异常
 7  * offer-----offer()
 8  * 
 9  * element-----element() 对为空,返回异常
10  * peek------peek()
11  * 
12  * remove----remove() 对为空,返回异常
13  * poll------poll()
14  * 
15  * empty-----isEmpty()
16  */
17 import java.util.LinkedList;
18 import java.util.Queue;
19 
20 public class QueueList<E> {
21     private Queue<E> queue = new LinkedList<E>();
22     
23     // 将指定的元素插入此队列(如果立即可行且不会违反容量限制),在成功时返回 true,
24     //如果当前没有可用的空间,则抛出 IllegalStateException。
25     public boolean add(E e){
26         return queue.add(e);
27     }
28     
29     //获取,但是不移除此队列的头。
30     public E element(){
31         return queue.element();
32     }
33     
34     //将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时,
35     //此方法通常要优于 add(E),后者可能无法插入元素,而只是抛出一个异常。
36     public boolean offer(E e){
37         return queue.offer(e);
38     }
39     
40     //获取但不移除此队列的头;如果此队列为空,则返回 null
41     public E peek(){
42         return queue.peek();
43     }
44     
45     //获取并移除此队列的头,如果此队列为空,则返回 null
46     public E poll(){
47         return queue.poll();
48     }
49     
50     //获取并移除此队列的头
51     public E remove(){
52         return queue.remove();
53     }
54     
55     //判空
56     public boolean empty() {
57         return queue.isEmpty();
58     }
59     public static void main(String[] args) {
60           QueueList<Integer> queueList=new QueueList<>();
61           for (int i = 0; i < 5; i++) {
62               queueList.add(i);
63           }
64           /*while (!queueList.empty()) {
65             System.out.println(queueList.peek());
66         }
67           System.out.println();
68           */
69           while (!queueList.empty()) {
70             System.out.print(queueList.poll()+" ");
71         }
72       }
73 }

 

本文参考地址:http://www.cnblogs.com/CherishFX/p/4608880.html 并在此博客的基础上进行了一些修改

 

Java实现栈和队列

标签:lis   ati   栈的链式存储   arch   als   illegal   empty   一个   node   

原文地址:https://www.cnblogs.com/midiyu/p/8168618.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!