一、棧
棧的定義
棧(Stack)是限制僅在表的一端進行插入和刪除運算的線性表。
(1)通常稱插入、刪除的這一端為棧頂 (Top),另一端稱為棧底 (Bottom)。
(2)當表中沒有元素時稱為空白棧。
(3)棧為後進先出(Last In First Out)的線性表,簡稱為 LIFO 表。
棧的修改是按後進先出的原則進行。每次刪除(退棧)的總是當前棧中"
最新"的元素,即最後插入(進棧)的元素,而最先插入的是被放在棧的底部,
要到最後才能刪除。
2、棧的基本運算
(1) 判斷棧是否為空白
boolean isEmpty();
(2)清空棧
void clear();
(3)棧的長度
int length();
(4)資料入棧
boolean push(T data);
(5)資料出棧 ,棧中刪除
T pop();
(6)資料出棧 ,棧中不刪除
T peek();
二、代碼編寫
1、介面類
package com.lin.stack;/** * 功能概要:棧的介面類 * * @author linbingwen * @since 2015年8月29日 */public interface MyStack<T> {/** * 判斷棧是否為空白 * @author linbingwen * @since 2015年8月29日 * @return */ boolean isEmpty(); /** * 清空棧 * @author linbingwen * @since 2015年8月29日 */ void clear(); /** * 棧的長度 * @author linbingwen * @since 2015年8月29日 * @return */ int length(); /** * 資料入棧 * @author linbingwen * @since 2015年8月29日 * @param data * @return */ boolean push(T data); /** * 資料出棧 ,棧中刪除 * @author linbingwen * @since 2015年8月29日 * @return */ T pop(); /** * 資料出棧 ,棧中不刪除 * @author linbingwen * @since 2015年8月29日 * @return */ T peek(); }
2、數組實現棧
package com.lin.stack;/** * 功能概要:數組實現棧 * * @author linbingwen * @since 2015年8月29日 */public class MyArrayStack<T> implements MyStack<T> {private Object[] objs = new Object[16]; private int size;@Overridepublic boolean isEmpty() {return size == 0;}@Overridepublic void clear() { for (int i = 0; i < objs.length; i++) {objs[i] = null; size--;}}@Overridepublic int length() {return size;}@Overridepublic boolean push(T data) {if(size == (objs.length-1)){Object[] temp = new Object[objs.length*2]; for (int i = 0; i < objs.length; i++) { temp[i]=objs[i];} objs= temp;}objs[size++]=data;return true;}@Override@SuppressWarnings("unchecked") public T pop() {return size == 0?null:(T) objs[(size--)-1];}@Override@SuppressWarnings("unchecked") public T peek() {return size == 0?null:(T) objs[size];}}
3、鏈表實現棧
package com.lin.stack;/** * 功能概要: * * @author linbingwen * @since 2015年8月29日 */public class MyListStack<T> implements MyStack<T>{private int size;private Node top;class Node{T data;Node pre;}@Overridepublic boolean isEmpty() {return size == 0;}@Overridepublic void clear() {top = null;}@Overridepublic int length() {return size;}@Overridepublic boolean push(T data) {Node node = new Node();node.data=data;if( null == top){top = node;}else {node.pre = top;top =node;}size++;return true;}@Overridepublic T pop() {if(size == 0){return null;}T data = top.data;top = top.pre;size--;return data;}@Overridepublic T peek() {if(size == 0){return null;}T data = top.data;return data;}}
4、測試
package com.lin.stack;/** * 功能概要: * * @author linbingwen * @since 2015年8月29日 */public class StackTest {/** * @author linbingwen * @since 2015年8月29日 * @param args */public static void main(String[] args) {MyStack<Integer> myStack1 = new MyArrayStack<Integer>();MyStack<Integer> myStack2 = new MyListStack<Integer>();for(int i =0;i<30;i++){myStack1.push(i);myStack2.push(i);}System.out.println("數組實現的棧輸出如下 ");for(int j =0;j<30;j++){System.out.print(myStack1.pop()+" ");}System.out.println();System.out.println("鏈表實現的棧輸出如下 ");for(int k =0;k<30;k++){System.out.print(myStack2.pop()+" ");}}}
輸出結果如下:
或者 看這裡:
數組實現的棧輸出如下
29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
鏈表實現的棧輸出如下
29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0