棧做爲一種數據結構,是一種只能在一端進行插入和刪除操做。它按照先進後出的原則存儲數據,先進入的數據被壓入棧底,最後的數據在棧頂,須要讀數據的時候從棧頂開始彈出數據(最後一個數據被第一個讀出來)。棧被使用於很是多的地方,例如瀏覽器中的後退按鈕,文本編輯器中的撤銷機制。node
進棧的時候是1先進,而後是二、三、四、五、6,出棧的時候是先6出,而後是五、四、三、二、1python
做爲一個棧(用stack來表示),最基本的方法有下面幾個:瀏覽器
stack.push(e): 將元素e添加到S的棧頂數據結構
stack.pop(): 從棧S中移除並返回棧頂的元素,若是此時棧是空的,那麼這個操做將會報錯app
stack.top(): 不移除棧頂元素,但返回棧頂元素,若是此時棧是空的,那麼這個操做將會報錯編輯器
stack.is_empty(): 若是棧爲空,則返回True,不然返回Falsespa
len(stack): 返回棧中元素的數量,使用len的特殊方法實現code
class Stack(): """ 以list爲基礎實現的棧 """ def __init__(self): self._data = [] def __len__(self): return len(self._data) def is_empty(self): if len(self._data) == 0: return True else: return False def push(self, e): self._data.append(e) def pop(self): if self.is_empty(): print("棧爲空") return return self._data.pop() def top(self): if self.is_empty(): print("棧爲空") return return self._data[-1] def travel(self): for i in range(0,len(self._data)): print("%d"%self._data[i]) if __name__ == '__main__': print("建立棧") stack = Stack() stack.pop() print("驗證是否爲空:",end="") empty = stack.is_empty() if empty == True: print("空棧") else: print("不是空") print("進棧") stack.push(1) stack.push(2) stack.push(3) stack.push(4) stack.push(5) stack.push(6) print("遍歷驗證進棧") stack.travel() print("判斷是否爲空:",end=" ") empty = stack.is_empty() if empty == True: print("空棧") else: print("不是空") print("出棧:",end=" ") pop = stack.pop() print(pop) stack.travel() print("驗證棧頂元素:",end=" ") top = stack.top() print(top)
運行結果爲:blog
建立棧 棧爲空 驗證是否爲空:空棧 進棧 遍歷驗證進棧 1 2 3 4 5 6 判斷是否爲空: 不是空 出棧: 6 1 2 3 4 5 驗證棧頂元素: 5it
// main.m // 棧 // Created by 侯壘 on 2019/7/3. // Copyright © 2019 可愛的侯老師. All rights reserved. # include<stdio.h> typedef struct N { int num; struct N *next; }Node; Node * createNode(int num) { Node *node = (Node *)malloc(sizeof(Node)); node->num = num; node->next = NULL; return node; } Node * createStack() { Node *head = NULL; return head; } int is_empty(Node *head) { if (head == NULL) { return 1; } else { return 0; } } int length(Node *head) { Node *current = head; if (is_empty(head)) { return 0; } int count = 1; while (current->next!=NULL) { count++; current = current->next; } return count; } Node *push(Node *head, int num) { Node *node = createNode(num); if (is_empty(head)==1) { head = node; } else { Node *current = head; while (current->next!=NULL) { current = current->next; } current->next = node; } return head; } Node *pop(Node *head) { if (is_empty(head) == 1) { printf("站爲空"); return head; } else { Node *current = head; int len = length(head); if (len == 1) { head = NULL; } else { for (int i=0; i<len-2;i++) { current = current->next; } current->next = NULL; } } return head; } int top(Node *head) { if (is_empty(head)) { printf("棧爲空"); return -1; } return head->num; } void travel(Node *head) { if (is_empty(head) == 1) { printf("站爲空\n"); } else { Node *current = head; int len = length(head); for (int i = 0; i<len; i++) { printf("%d ",current->num); current = current->next; } printf("\n"); } } int main(int argc, const char * argv[]) { printf("建立棧\n"); Node *head = createStack(); printf("驗證是否爲空: "); int empty = is_empty(head); if (empty == 1) { printf("棧爲空\n"); } else { printf("棧不爲空\n"); } printf("驗證進棧\n"); head = push(head, 1); travel(head); head = push(head, 2); head = push(head, 3); head = push(head, 4); head = push(head, 5); head = push(head, 6); travel(head); printf("驗證棧頂元素\n"); int t = top(head); printf("top = %d\n",t); printf("驗證出棧\n"); head = pop(head); travel(head); head = pop(head); travel(head); head = pop(head); travel(head); head = pop(head); travel(head); head = pop(head); travel(head); head = pop(head); travel(head); return 0; }
運行結果爲:
建立棧 驗證是否爲空: 棧爲空 驗證進棧 1 1 2 3 4 5 6 驗證棧頂元素 top = 1 驗證出棧 1 2 3 4 5 1 2 3 4 1 2 3 1 2 1 站爲空