這篇來學習什麼棧和隊列,以及棧和隊列的基本特徵,然後代碼實現棧的實現
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