數據結構和算法-4-棧和隊列

這篇來學習什麼棧和隊列,以及棧和隊列的基本特徵,然後代碼實現棧的實現

1.棧

棧(stack)也有叫堆棧,是一種容器,可存入數據元素,訪問元素,刪除元素,它的特點在於只能允許容器的一端(稱爲棧頂端,top)進行加入數據(push)和輸出數據(pop)的運算。沒有了位置概念,保證任何時候可以訪問、刪除的元素都是此前最後存入的那個元素,確定了一種默認訪問順序。
由於棧數據結構只允許一端進行操作,因而按照後進先出(LIFO, last in first out)的原因運作。

 

2.隊列

隊列(queue)是隻允許在一端進行插入操作,而在另一端進行刪除操作的線性表。
隊列是一種先進先出(First in First Out)的線性表。允許插入的一端爲隊尾,允許刪除的一端爲隊頭。隊列不允許在中間部位進行操作!假設隊列是q=(a1,a2,a3,...an),那麼a1就是隊頭元素,an是隊尾元素,這樣我們就可以刪除時,總是從a1開始,而插入時,總時在隊列最後。這也比較符合我們生活中的習慣,排在第一個優先出列,最後來的當然排隊伍最後。

 

3.棧結構的實現

棧可以用順序表實現,也可以用鏈表實現,鏈表後面來學。在python中,list是順序表實現的,我們用list來實現棧。

棧的操作
stack() 創建一個新的空棧
push(item) 添加一個新的元素item到棧頂
pop() 彈出棧頂元素
peek() 返回棧頂元素
is_empty() 判斷棧是否爲空
size() 返回棧的元素個數

Python的實現方式

# coding:utf-8


class Stack(object):
    """定義一個棧"""

    def __init__(self):
        self.__list = []

    def push(self, item):
        """添加一個新的元素item到棧頂"""
        self.__list.append(item)  # append是尾部添加元素,這裏選擇尾部操作添加和刪除

    def pop(self):
        """彈出棧頂元素"""
        return self.__list.pop()

    def peek(self):
        """返回棧頂元素"""
        if self.__list:
            return self.__list[-1]
        else:
            return None  # 如果爲空返回null

    def is_empty(self):
        """判斷棧是否爲空"""
        return self.__list == []  # 判斷是否爲空列表

    def size(self):
        """返回棧內元素個數"""
        return len(self.__list)


if __name__ == "__main__":
    s = Stack()
    s.push(1)
    s.push(2)
    s.push(3)
    s.push(4)
    print(s.size())
    print("===========")
    print(s.pop())
    print(s.pop())
    print(s.pop())
    print(s.pop())

    print(s.is_empty())

運行測試下

4
===========
4
3
2
1
True

Java的實現方式

Java這邊用數組來實現下棧的結構

package stack;
 
public class MyStack {
	//棧的底層是一個數組,由於一些特徵,我們取名叫做棧
	private long[] arr;
	private int top; //元素索引
	
	/**
	 * 默認無參構造
	 */
    public MyStack() {
    	arr = new long[10];
    	top = -1; // 表示當前棧內沒有元素,top等於0表示有一個元素
    }
    
    /**
     * 帶參數的構造
     */
    public MyStack(int maxsize) {
    	arr = new long[maxsize];
    	top = -1;
    }
    
    /**
     * 添加數據
     */
    public void push(int value) {
    	// 由於top默認等於-1,所以沒壓棧一個元素,top就自增
    	arr[++top] = value;
    }
    
    /**
     * 移除數據
     */
    public long pop() {
    	// 由於棧特點,移除元素每次都是移除最上面的那一個
    	return arr[top--];
    }
    
    /**
     * 查看數據:查看數據和pop不同
     */
    public long peek() {
    	//只能查看最上面那個元素
    	return arr[top];
    }
    
    /**
     * 判斷是否爲空
     */
    public boolean isEmpty() {
    	return top == -1; // 爲-1說明沒有元素就爲空
    }
    
    /**
     * 判斷棧是否滿了
     */
    public boolean isFull() {
    	return top == arr.length - 1;
    }
}

Java的測試類

package stack;
 
public class TestMyStack {
 
	public static void main(String[] args) {
		MyStack ms = new MyStack(4);
		
		ms.push(2);
		ms.push(23);
		ms.push(51);
		ms.push(39);
        
		System.out.println(ms.isEmpty());
		System.out.println(ms.isFull());
		
		//彈棧兩個元素
		ms.pop();
		ms.pop();
		//查找當前top元素是多少
		System.out.println(ms.peek());
		System.out.println(ms.isFull());
	}
}

運行結果

false
true
23
false

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章